3515 lines
No EOL
239 KiB
PHP
3515 lines
No EOL
239 KiB
PHP
<?php
|
|
/****************************************************************************************
|
|
* LiveZilla objects.stats.inc.php
|
|
*
|
|
* Copyright 2014 LiveZilla GmbH
|
|
* All rights reserved.
|
|
* LiveZilla is a registered trademark.
|
|
*
|
|
* Improper changes to this file may cause critical errors.
|
|
***************************************************************************************/
|
|
|
|
if(!defined("IN_LIVEZILLA"))
|
|
die();
|
|
|
|
class StatisticProvider
|
|
{
|
|
public $CurrentDay;
|
|
public $CurrentMonth;
|
|
public $CurrentYear;
|
|
public static $Rendertimes;
|
|
public static $DayItemAmount;
|
|
public static $MaxUsersAmount;
|
|
public static $Dereferrer;
|
|
public static $AggregateDomains;
|
|
public static $HiddenFilenames;
|
|
public static $AllowedParameters;
|
|
public static $TimeoutTrack;
|
|
public static $Domains;
|
|
public static $Blacklist;
|
|
public static $SearchEngines;
|
|
public static $RoundPrecision;
|
|
public static $AllGoalsRequiredForConversion;
|
|
public static $AutoUpdateTime = 3600;
|
|
public static $StatisticKey;
|
|
public static $Durations;
|
|
public static $DrawChartImages;
|
|
public static $UpdateInterval;
|
|
public static $OpeningHours = 24;
|
|
public static $GraphOverallWidth = 670;
|
|
|
|
function __construct()
|
|
{
|
|
StatisticProvider::DefineConfiguration();
|
|
$results = array();
|
|
if(!empty(CacheManager::$ActiveManager) && CacheManager::$ActiveManager->GetData(DATA_CACHE_KEY_STATS,$results))
|
|
{
|
|
if(isset($results["day"]) && $results["day"] == date("z"))
|
|
{
|
|
if(!empty($results["aggs_done"]))
|
|
{
|
|
if(!empty($results["create_done"]))
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$results["day"] = date("z");
|
|
if($this->CloseAggregations())
|
|
{
|
|
$results["aggs_done"] = true;
|
|
if($this->CreateItems())
|
|
$results["create_done"] = true;
|
|
}
|
|
|
|
if(!empty(CacheManager::$ActiveManager))
|
|
CacheManager::$ActiveManager->SetData(DATA_CACHE_KEY_STATS,$results);
|
|
}
|
|
|
|
function CreateItems()
|
|
{
|
|
$this->CurrentDay = new StatisticDay(date("Y"),date("n"),date("j"),0,0);
|
|
if($this->CurrentDay->CreateReport)
|
|
$this->CurrentDay->Save();
|
|
|
|
$this->CurrentMonth = new StatisticMonth(date("Y"),date("n"),0,0,0);
|
|
if($this->CurrentMonth->CreateReport)
|
|
$this->CurrentMonth->Save();
|
|
|
|
$this->CurrentYear = new StatisticYear(date("Y"),0,0,0,0);
|
|
if($this->CurrentYear->CreateReport)
|
|
$this->CurrentYear->Save();
|
|
|
|
return true;
|
|
}
|
|
|
|
function CloseAggregations()
|
|
{
|
|
if(date("G") == "0")
|
|
return false;
|
|
|
|
$result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE ((`day`<'" . DBManager::RealEscape(date("d")) . "' AND `month`='" . DBManager::RealEscape(date("n")) . "' AND `year`='" . DBManager::RealEscape(date("Y")) . "') OR (`year`<'" . DBManager::RealEscape(date("Y")) . "') OR (`month`<'" . DBManager::RealEscape(date("n")) . "')) AND (`aggregated`=0 OR `aggregated`>" . (time() - 300) . ") AND `month`>0 AND `day`>0 ORDER BY `year` ASC,`month` ASC,`day` ASC LIMIT 1;");
|
|
if($result)
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(empty($row["aggregated"]))
|
|
{
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS . "` SET `aggregated`=" . time() . " WHERE `year`='" . $row["year"] . "' AND `month`='" . $row["month"] . "' AND `day`='" . $row["day"] . "' LIMIT 1;");
|
|
$time=mktime(1,1,1,$row["month"],$row["day"],$row["year"]);
|
|
$this->AggregateDay(date("Y",$time),date("n",$time),date("d",$time));
|
|
}
|
|
return false;
|
|
}
|
|
$result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE `month`>0 AND ((`year`='" . DBManager::RealEscape(date("Y")) . "' AND `month`<'" . DBManager::RealEscape(date("n")) . "') OR (`year`<'" . DBManager::RealEscape(date("Y")) . "')) AND (`aggregated`=0 OR `aggregated`>" . (time() - 300) . ") AND `day`=0 ORDER BY `year` ASC,`month` ASC LIMIT 1;");
|
|
if($result)
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(empty($row["aggregated"]))
|
|
{
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS . "` SET `aggregated`=" . time() . " WHERE `year`=" . $row["year"] . " AND `month`=" . $row["month"] . " AND `day`=0 LIMIT 1;");
|
|
$this->AggregateMonth($row["year"],$row["month"]);
|
|
}
|
|
return false;
|
|
}
|
|
$result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE `year`>0 AND `year`<'" . date("Y") . "' AND `day`=0 AND `month`=0 AND (`aggregated`=0 OR `aggregated`>" . (time() - 300) . ") ORDER BY `year` ASC LIMIT 1;");
|
|
if($result)
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(empty($row["aggregated"]))
|
|
{
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS . "` SET `aggregated`=" . time() . " WHERE `year`=" . $row["year"] . " AND `month`=0 AND `day`=0 LIMIT 1;");
|
|
$this->AggregateYear($row["year"]);
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function AggregateYear($_year)
|
|
{
|
|
$year = new StatisticYear($_year,0,0,0,0);
|
|
$year->Close();
|
|
}
|
|
|
|
function AggregateMonth($_year,$_month)
|
|
{
|
|
$month = new StatisticMonth($_year,$_month,0,0,0);
|
|
$month->Close();
|
|
}
|
|
|
|
function AggregateDay($_year,$_month,$_day)
|
|
{
|
|
$day = new StatisticDay($_year,$_month,$_day,0,0);
|
|
$day->Close();
|
|
}
|
|
|
|
function ProcessAction($_actionType,$_params=null)
|
|
{
|
|
if($this->CurrentDay==null)
|
|
if($_actionType != ST_ACTION_LOG_STATUS)
|
|
$this->CreateItems();
|
|
if($_actionType == ST_ACTION_FORWARDED_CHAT)
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS . "` SET `chats_forwards`=`chats_forwards`+1 WHERE" . $this->CurrentDay->GetDateMatch(true, true, true) . ";");
|
|
else if($_actionType == ST_ACTION_INTERNAL_POST)
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS . "` SET `chats_posts_internal`=`chats_posts_internal`+1 WHERE" . $this->CurrentDay->GetDateMatch(true, true, true) . ";");
|
|
else if($_actionType == ST_ACTION_EXTERNAL_POST)
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS . "` SET `chats_posts_external`=`chats_posts_external`+1 WHERE" . $this->CurrentDay->GetDateMatch(true, true, true) . ";");
|
|
else if($_actionType == ST_ACTION_LOG_STATUS)
|
|
$this->LogStatus($_params[0]);
|
|
else if($_actionType == ST_ACTION_LOG_CRAWLER_ACCESS)
|
|
$this->LogCrawlerAccess($_params[0]);
|
|
else if($_actionType == ST_ACTION_GOAL)
|
|
$this->MarkGoalReached($_params[0],$_params[1],$_params[2],$_params[3]);
|
|
}
|
|
|
|
function MarkGoalReached($_visitorId,$_goalId,$_firstVisit,$_queryId)
|
|
{
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_VISITOR_GOALS . "` (`visitor_id`,`goal_id`,`time`,`first_visit`,`query`) VALUES ('" . DBManager::RealEscape($_visitorId) . "','" . DBManager::RealEscape($_goalId) . "','" . time() . "','" . DBManager::RealEscape($_firstVisit) . "','" . DBManager::RealEscape($_queryId) . "');");
|
|
}
|
|
|
|
function LogCrawlerAccess($_crawlerId)
|
|
{
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_CRAWLERS . "` (`year`,`month`,`day`,`crawler`) VALUES (" . $this->CurrentDay->GetSQLDateValues() . ",'" . DBManager::RealEscape($_crawlerId) . "');");
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS_CRAWLERS . "` SET `amount`=`amount`+1 WHERE `crawler`='" . DBManager::RealEscape($_crawlerId) . "' AND" . $this->CurrentDay->GetDateMatch() . ";");
|
|
}
|
|
|
|
function LogStatus($_user)
|
|
{
|
|
if(!$_user->AffectsStatistic())
|
|
return;
|
|
|
|
$minstate = $minuserstate = USER_STATUS_OFFLINE;
|
|
foreach($_user->Groups as $groupid)
|
|
{
|
|
$groupstate = USER_STATUS_OFFLINE;
|
|
if(isset(Server::$Groups[$groupid]) && Server::$Groups[$groupid]->IsOpeningHour())
|
|
foreach(Server::$Operators as $user)
|
|
if($user->Status != USER_STATUS_OFFLINE && $user->AffectsStatistic() && in_array($groupid,$user->Groups))
|
|
$groupstate = min($groupstate,((!in_array($groupid,$user->GroupsAway)) ? $user->Status : USER_STATUS_OFFLINE));
|
|
$identities[$groupid] = $groupstate;
|
|
$minstate = min($minstate,$groupstate);
|
|
$minuserstate = min($minuserstate,((!in_array($groupid,$_user->GroupsAway)) ? max($_user->Status,$groupstate) : USER_STATUS_OFFLINE));
|
|
}
|
|
|
|
$identities[$_user->SystemId] = $minuserstate;
|
|
$identities[GROUP_EVERYONE_INTERN] = $minstate;
|
|
foreach($identities as $userid => $status)
|
|
{
|
|
$createHour = false;
|
|
$result = DBManager::Execute(true, "SELECT `status`,`time`,`confirmed` FROM `" . DB_PREFIX . DATABASE_OPERATOR_STATUS . "` WHERE `internal_id`='" . DBManager::RealEscape($userid) . "' ORDER BY `time` DESC LIMIT 1;");
|
|
if($result && $row = DBManager::FetchArray($result))
|
|
{
|
|
if($row["confirmed"] > time()-30 && $row["status"] == $status)
|
|
return;
|
|
|
|
$openSpan = (date("H",$row["confirmed"])==date("H",$row["time"]) && date("z",$row["time"])==date("z") && date("m",$row["time"])==date("m")); // open span when confirmed hour not next hour and same day and same month
|
|
$closeSpan = $openSpan && $row["status"] == $status; // open and status matches current
|
|
|
|
if(date("z",$row["time"])>date("z") || (date("z",$row["time"])==date("z") && date("H",$row["time"])>date("H")))
|
|
return;
|
|
|
|
if($closeSpan && date("H",$row["time"]) == date("H"))
|
|
{
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_OPERATOR_STATUS . "` SET `confirmed`='" . DBManager::RealEscape(time()) . "' WHERE `internal_id`='" . DBManager::RealEscape($userid) . "' ORDER BY `time` DESC LIMIT 1;");
|
|
}
|
|
else if(/*$closeSpan && date("H",$row["time"]) == date("H")-1 && */date("i",$row["confirmed"]) >= 58)
|
|
{
|
|
$time = mktime(date("H",$row["time"])+1,0,0,date("n",$row["time"]),date("d",$row["time"]),date("Y",$row["time"]));
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_OPERATOR_STATUS . "` SET `confirmed`='" . DBManager::RealEscape($time) . "' WHERE `internal_id`='" . DBManager::RealEscape($userid) . "' ORDER BY `time` DESC LIMIT 1;");
|
|
}
|
|
else
|
|
{
|
|
$createHour = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$createHour = true;
|
|
}
|
|
|
|
if($createHour)
|
|
{
|
|
if(date("i") <= 2)
|
|
{
|
|
$time = mktime(date("H"),0,0,date("n"),date("d"),date("Y"));
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_OPERATOR_STATUS . "` WHERE `internal_id`='" . DBManager::RealEscape($userid) . "' AND `time`=" . intval($time) . " LIMIT 1;");
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_OPERATOR_STATUS . "` (`time` ,`confirmed` ,`internal_id` ,`status`) VALUES ('" . DBManager::RealEscape($time) . "','" . DBManager::RealEscape(time()) . "','" . DBManager::RealEscape($userid) . "','" . DBManager::RealEscape($status) . "');");
|
|
}
|
|
else
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_OPERATOR_STATUS . "` (`time` ,`confirmed` ,`internal_id` ,`status`) VALUES ('" . DBManager::RealEscape(time() - 1) . "','" . DBManager::RealEscape(time()) . "','" . DBManager::RealEscape($userid) . "','" . DBManager::RealEscape($status) . "');");
|
|
}
|
|
}
|
|
}
|
|
|
|
function ResetData()
|
|
{
|
|
$tables = array(DATABASE_VISITOR_GOALS,DATABASE_VISITOR_DATA_CRAWLERS,DATABASE_VISITOR_DATA_BROWSERS,DATABASE_VISITOR_DATA_TITLES,DATABASE_VISITOR_DATA_PATHS,DATABASE_VISITOR_DATA_CITIES,DATABASE_VISITOR_DATA_REGIONS,DATABASE_VISITOR_DATA_ISPS,DATABASE_VISITOR_DATA_PAGES,DATABASE_VISITOR_DATA_DOMAINS,DATABASE_VISITOR_DATA_QUERIES,DATABASE_VISITOR_DATA_SYSTEMS,DATABASE_VISITOR_DATA_RESOLUTIONS);
|
|
foreach($tables as $table)
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . $table . "`;");
|
|
}
|
|
|
|
function ResetDays()
|
|
{
|
|
$tables = array(DATABASE_STATS_AGGS_FEEDBACKS,DATABASE_STATS_AGGS_EVENTS,DATABASE_STATS_AGGS_GOALS,DATABASE_STATS_AGGS_GOALS_QUERIES,DATABASE_STATS_AGGS_PAGES_ENTRANCE,DATABASE_STATS_AGGS_PAGES_EXIT,DATABASE_STATS_AGGS,DATABASE_STATS_AGGS_CRAWLERS,DATABASE_STATS_AGGS_AVAILABILITIES,DATABASE_STATS_AGGS_DOMAINS,DATABASE_STATS_AGGS_BROWSERS,DATABASE_STATS_AGGS_RESOLUTIONS,DATABASE_STATS_AGGS_COUNTRIES,DATABASE_STATS_AGGS_VISITS,DATABASE_STATS_AGGS_SYSTEMS,DATABASE_STATS_AGGS_LANGUAGES,DATABASE_STATS_AGGS_CITIES,DATABASE_STATS_AGGS_REGIONS,DATABASE_STATS_AGGS_ISPS,DATABASE_STATS_AGGS_QUERIES,DATABASE_STATS_AGGS_PAGES,DATABASE_STATS_AGGS_REFERRERS,DATABASE_STATS_AGGS_DURATIONS,DATABASE_STATS_AGGS_CHATS,DATABASE_STATS_AGGS_SEARCH_ENGINES,DATABASE_STATS_AGGS_VISITORS,DATABASE_STATS_AGGS_KNOWLEDGEBASE,DATABASE_STATS_AGGS_FEEDBACKS);
|
|
foreach($tables as $table)
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . $table . "`;");
|
|
}
|
|
|
|
function ResetAll()
|
|
{
|
|
$tables = array(DATABASE_VISITOR_BROWSERS,DATABASE_VISITOR_BROWSER_URLS,DATABASE_VISITORS,DATABASE_OPERATOR_STATUS,DATABASE_VISITOR_CHATS,DATABASE_VISITOR_CHAT_OPERATORS);
|
|
foreach($tables as $table)
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . $table . "`;");
|
|
$this->ResetDays();
|
|
$this->ResetData();
|
|
}
|
|
|
|
static function LogProcess($_process)
|
|
{
|
|
|
|
}
|
|
|
|
static function SetExecutionPoint($_partId)
|
|
{
|
|
self::$Rendertimes[] = array($_partId,SystemTime::GetMicroTimeFloat(microtime()));
|
|
}
|
|
|
|
static function GetExecutionTime()
|
|
{
|
|
$parts = "(" . self::$Rendertimes[0][0] . ")";
|
|
for($int=1;$int<count(self::$Rendertimes);$int++)
|
|
$parts .= " | " . round(self::$Rendertimes[$int][1]-self::$Rendertimes[$int-1][1],3) . " (" . self::$Rendertimes[$int][0] . ")";
|
|
return $parts;
|
|
}
|
|
|
|
static function DeleteHTMLReports()
|
|
{
|
|
if(!empty(Server::$Configuration->File["gl_st_ders"]) && is_numeric(Server::$Configuration->File["gl_st_derd"]))
|
|
{
|
|
foreach(array(STATISTIC_PERIOD_TYPE_MONTH,STATISTIC_PERIOD_TYPE_YEAR,STATISTIC_PERIOD_TYPE_DAY) as $type)
|
|
{
|
|
$files = IOStruct::ReadDirectory(PATH_STATS . $type,"");
|
|
foreach($files as $file)
|
|
{
|
|
$mtime = @filemtime(PATH_STATS . $type . "/" . $file);
|
|
if(!empty($mtime) && $mtime < (time()-(86400*Server::$Configuration->File["gl_st_derd"])))
|
|
@unlink(PATH_STATS . $type . "/" . $file);
|
|
}
|
|
}
|
|
$tables = array(DATABASE_STATS_AGGS_GOALS,DATABASE_STATS_AGGS_GOALS_QUERIES,DATABASE_STATS_AGGS_PAGES_ENTRANCE,DATABASE_STATS_AGGS_PAGES_EXIT,DATABASE_STATS_AGGS_CRAWLERS,DATABASE_STATS_AGGS_DOMAINS,DATABASE_STATS_AGGS_BROWSERS,DATABASE_STATS_AGGS_RESOLUTIONS,DATABASE_STATS_AGGS_COUNTRIES,DATABASE_STATS_AGGS_VISITS,DATABASE_STATS_AGGS_SYSTEMS,DATABASE_STATS_AGGS_LANGUAGES,DATABASE_STATS_AGGS_CITIES,DATABASE_STATS_AGGS_REGIONS,DATABASE_STATS_AGGS_ISPS,DATABASE_STATS_AGGS_QUERIES,DATABASE_STATS_AGGS_PAGES,DATABASE_STATS_AGGS_REFERRERS,DATABASE_STATS_AGGS_AVAILABILITIES,DATABASE_STATS_AGGS_DURATIONS,DATABASE_STATS_AGGS_CHATS,DATABASE_STATS_AGGS_SEARCH_ENGINES,DATABASE_STATS_AGGS_VISITORS);
|
|
$result = DBManager::Execute(true, "SELECT `year`,`month`,`day` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE `year`<" . date("Y") . " AND `aggregated`>0 AND `time`<" . (time() - (86400 * Server::$Configuration->File["gl_st_derd"])) . " LIMIT 1;");
|
|
if($result)
|
|
if($row = DBManager::FetchArray($result))
|
|
{
|
|
foreach($tables as $table)
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . $table . "` WHERE `year`<" . date("Y") . " AND `day`=" . $row["day"] . " AND `month`=" . $row["month"] . " AND `year`=" . $row["year"]);
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE `year`<" . date("Y") . " AND `aggregated`>0 AND `day`=" . $row["day"] . " AND `month`=" . $row["month"] . " AND `year`=" . $row["year"] . " LIMIT 1;");
|
|
}
|
|
}
|
|
}
|
|
|
|
static function DefineConfiguration()
|
|
{
|
|
StatisticProvider::$DayItemAmount = 25;//Server::$Configuration->File["gl_st_toam"];
|
|
StatisticProvider::$MaxUsersAmount = Server::$Configuration->File["gl_st_muvl"];
|
|
StatisticProvider::$Dereferrer = "http://dereferrer.livezilla.info/?url=";//Server::$Configuration->File["gl_st_dere"];
|
|
StatisticProvider::$AggregateDomains = false;//!empty(Server::$Configuration->File["gl_st_agdo"]);
|
|
StatisticProvider::$HiddenFilenames = explode(",","index.php,index.htm,index.html,home.html,index.asp");//explode(",",Server::$Configuration->File["gl_st_hifi"]);
|
|
StatisticProvider::$AllowedParameters = explode(",","id,module,area,product,category,article");//explode(",",Server::$Configuration->File["gl_st_getp"]);
|
|
StatisticProvider::$UpdateInterval = isset(Server::$Configuration->File["gl_st_upinh"]) ? abs(Server::$Configuration->File["gl_st_upinh"]) : 6;
|
|
StatisticProvider::$UpdateInterval = max(1,StatisticProvider::$UpdateInterval);
|
|
StatisticProvider::$UpdateInterval *= (60*60);
|
|
StatisticProvider::$TimeoutTrack = Server::$Configuration->File["timeout_track"];
|
|
StatisticProvider::$RoundPrecision = 2;//Server::$Configuration->File["gl_st_ropr"];
|
|
StatisticProvider::$AllGoalsRequiredForConversion = false;//Server::$Configuration->File["gl_st_atrc"];
|
|
StatisticProvider::$StatisticKey = substr(md5(Server::$Configuration->File["gl_lzid"]),0,12);
|
|
StatisticProvider::$Durations = array(1=>"00 - 01 min",2=>"01 - 05 min",3=>"05 - 10 min",4=>"10 - 15 min",5=>"15 - 30 min",6=>"30 - 60 min",7=>"> 60 min");
|
|
StatisticProvider::$DrawChartImages = true;//!empty(Server::$Configuration->File["gl_st_drch"]);
|
|
}
|
|
|
|
static function GetReportFromHash($_hash,$_year,$_month,$_day,$_users)
|
|
{
|
|
if(is_numeric($_year) && is_numeric($_month) && is_numeric($_day))
|
|
{
|
|
$result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE `day`='" . DBManager::RealEscape($_day) . "' AND `month`='" . DBManager::RealEscape($_month) . "' AND `year`='" . DBManager::RealEscape($_year) . "' LIMIT 1;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if($row["month"]==0)
|
|
$report = new StatisticYear($row["year"],0,0,$row["aggregated"],$row["mtime"]);
|
|
else if($row["day"]==0)
|
|
$report = new StatisticMonth($row["year"],$row["month"],0,$row["aggregated"],$row["mtime"]);
|
|
else
|
|
$report = new StatisticDay($row["year"],$row["month"],$row["day"],$row["aggregated"],$row["mtime"]);
|
|
|
|
if($report->GetHash() == $_hash && @file_exists($report->GetFilename(true,$_users)))
|
|
{
|
|
return $report->GetReportHTML($_users);
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static function GetDynamicDateFrame($_t)
|
|
{
|
|
return "<script>document.write(new Date(".date("Y",$_t).",".(date("n",$_t)-1).",".date("j",$_t).",".date("G",$_t).", ".date("i",$_t).", ".date("s",$_t).", 0).toLocaleDateString());</script>";
|
|
}
|
|
}
|
|
|
|
|
|
class StatisticMonth extends StatisticPeriod
|
|
{
|
|
function __construct($_year,$_month,$_day,$_aggregated,$_microtime)
|
|
{
|
|
parent::__construct($_year,$_month,$_day,$_aggregated,$_microtime);
|
|
$this->DayCount = date("t", strtotime($_year . "-" . $_month . "-01"));
|
|
$this->Type = STATISTIC_PERIOD_TYPE_MONTH;
|
|
$this->StartTime = mktime(0,0,0,$_month,1,$_year);
|
|
$this->EndTime = strtotime("-1 second",strtotime("+1 month",strtotime($_month."/01/".$_year." 00:00:00")));
|
|
$this->Delimiters = array($this->StartTime,$this->EndTime);
|
|
$this->DefineConfiguration();
|
|
$this->Closed = ($_month != date("n"));
|
|
}
|
|
|
|
function DefineConfiguration()
|
|
{
|
|
$this->CreateReport = true;//!empty(Server::$Configuration->File["gl_st_marp"]);
|
|
$this->IncludeBHVisitors = true;//!empty(Server::$Configuration->File["gl_st_mbhv"]);
|
|
$this->IncludeBHChats = true;//!empty(Server::$Configuration->File["gl_st_mbhc"]);
|
|
$this->IncludeBDVisitors = true;//!empty(Server::$Configuration->File["gl_st_mbdv"]);
|
|
$this->IncludeBDChats = true;//!empty(Server::$Configuration->File["gl_st_mbdc"]);
|
|
$this->IncludeTOPSystems = true;//!empty(Server::$Configuration->File["gl_st_mtsy"]);
|
|
$this->IncludeTOPOrigins = true;//!empty(Server::$Configuration->File["gl_st_mtor"]);
|
|
$this->IncludeTOPVisits = true;//!empty(Server::$Configuration->File["gl_st_mtvi"]);
|
|
$this->IncludeTOPISPs = true;//!empty(Server::$Configuration->File["gl_st_mtis"]);
|
|
$this->IncludeTOPPages = true;//!empty(Server::$Configuration->File["gl_st_mtpa"]);
|
|
$this->IncludeTOPEntranceExit = true;//!empty(Server::$Configuration->File["gl_st_mtee"]);
|
|
$this->IncludeTOPSearch = true;//!empty(Server::$Configuration->File["gl_st_mtse"]);
|
|
$this->IncludeTOPReferrers = true;//!empty(Server::$Configuration->File["gl_st_mtre"]);
|
|
$this->IncludeTOPKnowledgebase = true;//!empty(Server::$Configuration->File["gl_st_mtkb"]);
|
|
$this->IncludeTOPDomains = true;//!empty(Server::$Configuration->File["gl_st_mtdo"]);
|
|
$this->IncludeBOAvailability = true;//!empty(Server::$Configuration->File["gl_st_mboa"]);
|
|
$this->IncludeBOChats = true;//!empty(Server::$Configuration->File["gl_st_mboc"]);
|
|
$this->IncludeBOTickets = true;//!empty(Server::$Configuration->File["gl_st_mbot"]);
|
|
$this->IncludeBOInvites = true;//!empty(Server::$Configuration->File["gl_st_mboi"]);
|
|
$this->IncludeBOFeedbacks = true;//!empty(Server::$Configuration->File["gl_st_mbof"]);
|
|
}
|
|
|
|
function Load()
|
|
{
|
|
if(date("Y") == $this->Year && date("n") < $this->Month)
|
|
return false;
|
|
|
|
if($this->Type == STATISTIC_PERIOD_TYPE_MONTH)
|
|
{
|
|
$result = DBManager::Execute(true, "SELECT SUM(`on_chat_page`) AS `spages`,SUM(`browser_instances`) AS `bi`,SUM(`from_referrer`) AS `ref`,SUM(`search_engine`) AS `se`,SUM(`bounces`) AS `bounc`,SUM(`page_impressions`) AS `pi`,SUM(`visitors_unique`) AS `cvunique`,SUM(`js`) AS `json`,SUM(`visitors_recurring`) AS `rec` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_VISITORS . "` WHERE" . $this->GetDateMatch(true, true, false) . ";");
|
|
$row = DBManager::FetchArray($result);
|
|
$this->VisitorsTotal = (!empty($row["cvunique"]))?$row["cvunique"]:0;
|
|
$this->ChatPagesTotal = (!empty($row["spages"]))?$row["spages"]:0;
|
|
$this->JavascriptTotal = $row["json"];
|
|
$this->VisitorsRecurringTotal = $row["rec"];
|
|
$this->PageImpressionsTotal = ((!empty($row["pi"]))?$row["pi"]:0) - $this->ChatPagesTotal;
|
|
$this->VisitorBouncesTotal = $row["bounc"];
|
|
$this->FromSearchEngineTotal = $row["se"];
|
|
$this->FromReferrerTotal = $row["ref"];
|
|
$this->BrowserInstancesTotal = $row["bi"];
|
|
}
|
|
return parent::Load();
|
|
}
|
|
|
|
function LoadDays()
|
|
{
|
|
for($i=0;$i<$this->DayCount;$i++)
|
|
{
|
|
$time = $this->StartTime+($i*86400);
|
|
$day = date("d",$time);
|
|
if(!isset($this->Days[$day]))
|
|
{
|
|
$this->Days[$day] = new StatisticDay(date("Y",$time),date("n",$time),$day,0,0);
|
|
if(date("Y",$time) == date("Y") && date("n",$time) == date("n") && $day == date("d"))
|
|
{
|
|
$this->Days[$day]->SaveReportToFile();
|
|
}
|
|
else
|
|
$this->Days[$day]->Load();
|
|
}
|
|
}
|
|
ksort($this->Days);
|
|
}
|
|
|
|
function GetHTML()
|
|
{
|
|
$html = parent::GetHTML();
|
|
$month = ($this->Type == STATISTIC_PERIOD_TYPE_MONTH) ? $this->Month . " / " : "";
|
|
$html = str_replace("<!--header_span_overview-->",$month . $this->Year,$html);
|
|
return $html;
|
|
}
|
|
|
|
function Aggregate()
|
|
{
|
|
$_daySQL = " AND `day`>0 ";
|
|
foreach(array($this->TopVisitorTables,$this->TopBrowserURLTables) as $tables)
|
|
foreach($tables as $table => $field)
|
|
$this->AggregateValueCount(DB_PREFIX.$table,array($field),$_daySQL);
|
|
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_QUERIES,array("query"),$_daySQL,true," AND `type`=0");
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_QUERIES,array("query"),$_daySQL,false," AND `type`=1");
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_CRAWLERS,array("crawler"),$_daySQL);
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_GOALS,array("goal"),$_daySQL);
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_GOALS_QUERIES,array("goal","query"),$_daySQL);
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_DOMAINS,array("domain"),$_daySQL);
|
|
$this->AggregateSingleValues($_daySQL);
|
|
$this->AggregateDurations($_daySQL);
|
|
}
|
|
|
|
function AggregateSingleValues($_daySQL)
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
$result = DBManager::Execute(true, "SELECT SUM(`conversions`) AS `sconversions`,SUM(`sessions`) AS `svisitors`,SUM(`visitors_unique`) AS `uvisitors`,AVG(`avg_time_site`) AS `aavg_time_site`, SUM(`chats_posts_external`) AS `schats_posts_external`, SUM(`chats_posts_internal`) AS `schats_posts_internal`,SUM(`chats_forwards`) as `schats_forwards` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE" . $this->GetDateMatch(true, get_class($this) == "StatisticMonth", false) . $_daySQL . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
$time = SystemTime::GetMicroTime();
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS . "` (`year`, `month`, `day`,`time`,`mtime`,`sessions`,`visitors_unique`,`conversions`,`aggregated`, `chats_forwards`, `chats_posts_internal`, `chats_posts_external`, `avg_time_site`) VALUES (" . $this->GetSQLDateValues() . "," . $time[1] . "," . $time[0] . ",'" . DBManager::RealEscape($row["svisitors"]) . "','" . DBManager::RealEscape($row["uvisitors"]) . "','" . DBManager::RealEscape($row["sconversions"]) . "','" . DBManager::RealEscape(($this->Closed) ? time() : 0) . "','" . DBManager::RealEscape($row["schats_forwards"]) . "','" . DBManager::RealEscape($row["schats_posts_internal"]) . "','" . DBManager::RealEscape($row["schats_posts_external"]) . "','" . DBManager::RealEscape($row["aavg_time_site"]) . "')");
|
|
}
|
|
}
|
|
|
|
function AggregateDurations($_daySQL)
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_DURATIONS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
$result = DBManager::Execute(true, "SELECT `duration`,SUM(`amount`) AS `samount` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_DURATIONS . "` WHERE" . $this->GetDateMatch(true, get_class($this) == "StatisticMonth", false) . $_daySQL . " GROUP BY `duration`;");
|
|
while($row = DBManager::FetchArray($result))
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_DURATIONS . "` ( `year` ,`month`,`day` ,`duration` ,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row["duration"]) . "','" . DBManager::RealEscape($row["samount"]) . "')");
|
|
}
|
|
|
|
function AggregateValueCount($_table,$_fields,$_daySQL,$_clear=true,$_addWhere="")
|
|
{
|
|
$field_a = $_fields[0];
|
|
$field_b = (count($_fields) > 1) ? ",`".$_fields[1]."`" : "";
|
|
if($_clear)
|
|
DBManager::Execute(true, "DELETE FROM `" . $_table . "` WHERE" . $this->GetDateMatch() . ";");
|
|
|
|
if(DATABASE_STATS_AGGS_PAGES==$_table)
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`amount`) AS `sumfield` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_PAGES . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` AS `t1` ON `" . DB_PREFIX . DATABASE_STATS_AGGS_PAGES . "`.`url`=`t1`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PATHS . "` AS `t2` ON `t1`.`path` = t2.`id` WHERE" . $this->GetDateMatch(true, get_class($this) == "StatisticMonth", false) . $_daySQL . " GROUP BY `t1`.`id` ORDER BY `sumfield` DESC,`t1`.`id` DESC");
|
|
else
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`amount`) AS `sumfield` FROM `" . $_table . "` WHERE" . $this->GetDateMatch(true, get_class($this) == "StatisticMonth", false) . $_daySQL . $_addWhere . " GROUP BY `" . $field_a . "`" . $field_b . " ORDER BY `sumfield` DESC;");
|
|
|
|
$index = 0;
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(count($_fields) == 2)
|
|
$index = $row[$_fields[0]];
|
|
if(!isset($count[$index]))
|
|
$count[$index] = 0;
|
|
|
|
if($row["sumfield"] > 0 && $count[$index]++ < StatisticProvider::$DayItemAmount)
|
|
{
|
|
if(isset($row["type"]))
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . $_table . "` (`year`,`month`,`day`,`" . $_fields[0] . "`,`amount`,`type`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row[$_fields[0]]) . "','" . DBManager::RealEscape($row["sumfield"]) . "'," . intval($row["type"]) . ")");
|
|
else if(count($_fields) == 1)
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . $_table . "` (`year`,`month`,`day`,`" . $_fields[0] . "`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row[$_fields[0]]) . "','" . DBManager::RealEscape($row["sumfield"]) . "')");
|
|
else
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . $_table . "` (`year`,`month`,`day`,`" . $_fields[0] . "`,`" . $_fields[1] . "`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row[$_fields[0]]) . "','" . DBManager::RealEscape($row[$_fields[1]]) . "','" . DBManager::RealEscape($row["sumfield"]) . "')");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
class StatisticYear extends StatisticMonth
|
|
{
|
|
function __construct($_year,$_month,$_day,$_aggregated,$_microtime)
|
|
{
|
|
parent::__construct($_year,$_month,$_day,$_aggregated,$_microtime);
|
|
$this->DayCount = date("z", mktime(0,0,0,12,31,$_year))+1;
|
|
$this->Type = STATISTIC_PERIOD_TYPE_YEAR;
|
|
$this->StartTime = mktime(0,0,0,1,1,$_year);
|
|
$this->EndTime = strtotime("12/31/".$_year." 23:59:59");
|
|
$this->Delimiters = array($this->StartTime,$this->EndTime);
|
|
$this->Closed = ($_year != date("Y"));
|
|
$this->DefineConfiguration();
|
|
}
|
|
|
|
function DefineConfiguration()
|
|
{
|
|
$this->CreateReport = true;//!empty(Server::$Configuration->File["gl_st_yarp"]);
|
|
$this->IncludeBHVisitors = true;//!empty(Server::$Configuration->File["gl_st_ybhv"]);
|
|
$this->IncludeBHChats = true;//!empty(Server::$Configuration->File["gl_st_ybhc"]);
|
|
$this->IncludeBMVisitors = true;//!empty(Server::$Configuration->File["gl_st_ybmv"]);
|
|
$this->IncludeBMChats = true;//!empty(Server::$Configuration->File["gl_st_ybmc"]);
|
|
$this->IncludeTOPSystems = true;//!empty(Server::$Configuration->File["gl_st_ytsy"]);
|
|
$this->IncludeTOPOrigins = true;//!empty(Server::$Configuration->File["gl_st_ytor"]);
|
|
$this->IncludeTOPVisits = true;//!empty(Server::$Configuration->File["gl_st_ytvi"]);
|
|
$this->IncludeTOPISPs = true;//!empty(Server::$Configuration->File["gl_st_ytis"]);
|
|
$this->IncludeTOPPages = true;//!empty(Server::$Configuration->File["gl_st_ytpa"]);
|
|
$this->IncludeTOPEntranceExit = true;//!empty(Server::$Configuration->File["gl_st_ytee"]);
|
|
$this->IncludeTOPSearch = true;//!empty(Server::$Configuration->File["gl_st_ytse"]);
|
|
$this->IncludeTOPReferrers = true;//!empty(Server::$Configuration->File["gl_st_ytre"]);
|
|
$this->IncludeTOPKnowledgebase = true;//!empty(Server::$Configuration->File["gl_st_ytkb"]);
|
|
$this->IncludeTOPDomains = true;//!empty(Server::$Configuration->File["gl_st_ytdo"]);
|
|
$this->IncludeBOAvailability = true;//!empty(Server::$Configuration->File["gl_st_yboa"]);
|
|
$this->IncludeBOChats = true;//!empty(Server::$Configuration->File["gl_st_yboc"]);
|
|
$this->IncludeBOTickets = true;//!empty(Server::$Configuration->File["gl_st_ybot"]);
|
|
$this->IncludeBOInvites = true;//!empty(Server::$Configuration->File["gl_st_yboi"]);
|
|
$this->IncludeBOFeedbacks = true;//!empty(Server::$Configuration->File["gl_st_ybof"]);
|
|
}
|
|
|
|
function Load()
|
|
{
|
|
$result = DBManager::Execute(true, "SELECT SUM(`on_chat_page`) AS `spages`,SUM(`browser_instances`) AS `bi`,SUM(`from_referrer`) AS `ref`,SUM(`search_engine`) AS `se`,SUM(`bounces`) AS `bounc`,SUM(`page_impressions`) AS `pi`,SUM(`visitors_unique`) AS `cvunique`,SUM(`js`) AS `json`,SUM(`visitors_recurring`) AS `rec` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_VISITORS . "` WHERE" . $this->GetDateMatch(true, false, false) . ";");
|
|
$row = DBManager::FetchArray($result);
|
|
$this->VisitorsTotal = (!empty($row["cvunique"]))?$row["cvunique"]:0;
|
|
$this->ChatPagesTotal = (!empty($row["spages"]))?$row["spages"]:0;
|
|
$this->JavascriptTotal = $row["json"];
|
|
$this->VisitorsRecurringTotal = $row["rec"];
|
|
$this->PageImpressionsTotal = ((!empty($row["pi"]))?$row["pi"]:0) - $this->ChatPagesTotal;
|
|
$this->VisitorBouncesTotal = $row["bounc"];
|
|
$this->FromSearchEngineTotal = $row["se"];
|
|
$this->FromReferrerTotal = $row["ref"];
|
|
$this->BrowserInstancesTotal = $row["bi"];
|
|
return parent::Load();
|
|
}
|
|
|
|
function LoadMonths()
|
|
{
|
|
for($i=1;$i<=12;$i++)
|
|
{
|
|
$time = mktime(0,0,0,$i,1,$this->Year);
|
|
$this->Months[$i] = new StatisticMonth(date("Y",$time),$i,0,0,0);
|
|
if(date("Y",$time) == date("Y") && date("n",$time) == date("n"))
|
|
$this->Months[$i]->SaveReportToFile();
|
|
else
|
|
$this->Months[$i]->Load();
|
|
}
|
|
ksort($this->Months);
|
|
}
|
|
|
|
function GetHTML()
|
|
{
|
|
$html = parent::GetHTML();
|
|
$html = str_replace("<!--header_span_overview-->",$this->Year,$html);
|
|
return $html;
|
|
}
|
|
|
|
function Aggregate()
|
|
{
|
|
$_daySQL = " AND `month`>0 AND `day`=0 ";
|
|
foreach(array($this->TopVisitorTables,$this->TopBrowserURLTables) as $tables)
|
|
foreach($tables as $table => $field)
|
|
$this->AggregateValueCount(DB_PREFIX.$table,array($field),$_daySQL);
|
|
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_QUERIES,array("query"),$_daySQL,true," AND `type`=0");
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_QUERIES,array("query"),$_daySQL,false," AND `type`=1");
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_CRAWLERS,array("crawler"),$_daySQL);
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_GOALS,array("goal"),$_daySQL);
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_GOALS_QUERIES,array("goal","query"),$_daySQL);
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_DOMAINS,array("domain"),$_daySQL);
|
|
$this->AggregateSingleValues($_daySQL);
|
|
$this->AggregateDurations($_daySQL);
|
|
}
|
|
}
|
|
|
|
class StatisticDay extends StatisticPeriod
|
|
{
|
|
function __construct()
|
|
{
|
|
$this->Type = STATISTIC_PERIOD_TYPE_DAY;
|
|
$this->DayCount = 1;
|
|
if(func_num_args() >= 3)
|
|
{
|
|
$year = func_get_arg(0);
|
|
$months = func_get_arg(1);
|
|
$day = func_get_arg(2);
|
|
$aggregated = func_get_arg(3);
|
|
$microtime = func_get_arg(4);
|
|
parent::__construct($year,$months,$day,$aggregated,$microtime);
|
|
$this->Delimiters = array(mktime(0,0,0,$this->Month,$this->Day,$this->Year),mktime(23,59,59,$this->Month,$this->Day,$this->Year));
|
|
if($day != date("d"))
|
|
$this->Closed = true;
|
|
}
|
|
else
|
|
{
|
|
$time = func_get_arg(0);
|
|
parent::__construct(date("Y",$time),date("n",$time),date("d",$time),0,0);
|
|
}
|
|
$this->DefineConfiguration();
|
|
}
|
|
|
|
function DefineConfiguration()
|
|
{
|
|
$this->CreateReport = true;//!empty(Server::$Configuration->File["gl_st_darp"]);
|
|
$this->CreateVisitorList = true;//!empty(Server::$Configuration->File["gl_st_davl"]);
|
|
$this->IncludeBHVisitors = true;//!empty(Server::$Configuration->File["gl_st_dbhv"]);
|
|
$this->IncludeBHChats = true;//!empty(Server::$Configuration->File["gl_st_dbhc"]);
|
|
$this->IncludeTOPSystems = true;//!empty(Server::$Configuration->File["gl_st_dtsy"]);
|
|
$this->IncludeTOPOrigins = true;//!empty(Server::$Configuration->File["gl_st_dtor"]);
|
|
$this->IncludeTOPVisits = true;//!empty(Server::$Configuration->File["gl_st_dtvi"]);
|
|
$this->IncludeTOPISPs = true;//!empty(Server::$Configuration->File["gl_st_dtis"]);
|
|
$this->IncludeTOPPages = true;//!empty(Server::$Configuration->File["gl_st_dtpa"]);
|
|
$this->IncludeTOPEntranceExit = true;//!empty(Server::$Configuration->File["gl_st_dtee"]);
|
|
$this->IncludeTOPSearch = true;//!empty(Server::$Configuration->File["gl_st_dtse"]);
|
|
$this->IncludeTOPReferrers = true;//!empty(Server::$Configuration->File["gl_st_dtre"]);
|
|
$this->IncludeTOPKnowledgebase = true;//!empty(Server::$Configuration->File["gl_st_dtkb"]);
|
|
$this->IncludeTOPDomains = true;//!empty(Server::$Configuration->File["gl_st_dtdo"]);
|
|
$this->IncludeBOAvailability = true;//!empty(Server::$Configuration->File["gl_st_dboa"]);
|
|
$this->IncludeBOChats = true;//!empty(Server::$Configuration->File["gl_st_dboc"]);
|
|
$this->IncludeBOTickets = true;//!empty(Server::$Configuration->File["gl_st_dbot"]);
|
|
$this->IncludeBOInvites = true;//!empty(Server::$Configuration->File["gl_st_dboi"]);
|
|
$this->IncludeBOFeedbacks = true;//!empty(Server::$Configuration->File["gl_st_dbof"]);
|
|
}
|
|
|
|
function Load()
|
|
{
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT SUM(`on_chat_page`) AS `spages`,SUM(`browser_instances`) AS `bi`,SUM(`from_referrer`) AS `ref`,SUM(`search_engine`) AS `se`,SUM(`bounces`) AS `bounc`,SUM(`page_impressions`) AS `pi`,SUM(`visitors_unique`) AS `cvunique`,SUM(`js`) AS `json`,SUM(`visitors_recurring`) AS `rec` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_VISITORS . "` WHERE" . $this->GetDateMatch() . ";"));
|
|
$this->VisitorsTotal = (!empty($row["cvunique"]))?$row["cvunique"]:0;
|
|
$this->ChatPagesTotal = (!empty($row["spages"]))?$row["spages"]:0;
|
|
$this->JavascriptTotal = $row["json"];
|
|
$this->VisitorsRecurringTotal = $row["rec"];
|
|
$this->PageImpressionsTotal = ((!empty($row["pi"]))?$row["pi"]:0) - $this->ChatPagesTotal;
|
|
$this->VisitorBouncesTotal = $row["bounc"];
|
|
$this->FromSearchEngineTotal = $row["se"];
|
|
$this->FromReferrerTotal = $row["ref"];
|
|
$this->BrowserInstancesTotal = $row["bi"];
|
|
return parent::Load();
|
|
}
|
|
|
|
function GetVisitorsHTML()
|
|
{
|
|
$html = parent::GetVisitorsHTML();
|
|
$html = str_replace("<!--header_span_overview-->",StatisticProvider::GetDynamicDateFrame(mktime(0,0,0,$this->Month,$this->Day,$this->Year)),$html);
|
|
return $html;
|
|
}
|
|
|
|
function GetHTML()
|
|
{
|
|
$html = parent::GetHTML();
|
|
$html = str_replace("<!--header_span_overview-->",StatisticProvider::GetDynamicDateFrame(mktime(0,0,0,$this->Month,$this->Day,$this->Year)),$html);
|
|
return $html;
|
|
}
|
|
|
|
function PrepareTicketHourArray(&$_array,$_userId,$_hour)
|
|
{
|
|
if(!isset($_array[$_userId]))
|
|
$_array[$_userId] = array();
|
|
if(!isset($_array[$_userId][$_hour]))
|
|
$_array[$_userId][$_hour] = array("amount"=>0,"open"=>0,"in_progress"=>0,"closed"=>0,"deleted"=>0,"messages"=>0,"responses"=>0,"response_time"=>0,"resolves"=>0,"resolve_time"=>0);
|
|
}
|
|
|
|
function Aggregate()
|
|
{
|
|
$this->AggregateSingleValues("");
|
|
$this->AggregateOperatorTime("");
|
|
$this->AggregateDurations("");
|
|
$this->AggregateChats();
|
|
$this->AggregateTickets();
|
|
$this->AggregateFeedbacks();
|
|
$this->AggregateTOPS();
|
|
$this->AggregateKnowledgebase();
|
|
}
|
|
|
|
function AggregateTOPS()
|
|
{
|
|
foreach($this->TopVisitorTables as $table => $field)
|
|
$this->AggregateValueCount(DB_PREFIX.$table,DB_PREFIX.DATABASE_VISITORS,$field,"entrance",true);
|
|
|
|
$this->AggregateValueCount(DB_PREFIX.DATABASE_STATS_AGGS_QUERIES,DB_PREFIX.DATABASE_VISITOR_BROWSERS,"query","last_active");
|
|
$this->AggregateDayPageCount(DB_PREFIX.DATABASE_STATS_AGGS_DOMAINS,"domain","`t1`.`domain`","`t1`.`domain`");
|
|
$this->AggregateDayPageCount(DB_PREFIX.DATABASE_STATS_AGGS_PAGES,"url","`".DB_PREFIX."visitor_browser_urls`.`url`",((StatisticProvider::$AggregateDomains)?"`t1`.`path`":"`".DB_PREFIX."visitor_browser_urls`.`url`"));
|
|
$this->AggregateDayEntranceExitPageCount(DB_PREFIX.DATABASE_STATS_AGGS_PAGES_ENTRANCE,false,",`t1`.`domain`");
|
|
$this->AggregateDayEntranceExitPageCount(DB_PREFIX.DATABASE_STATS_AGGS_PAGES_EXIT,true,",`t1`.`domain`");
|
|
$this->AggregateDayReferrerCount(DB_PREFIX.DATABASE_STATS_AGGS_REFERRERS);
|
|
$this->AggregateDaySearchEngineCount(DB_PREFIX.DATABASE_STATS_AGGS_SEARCH_ENGINES);
|
|
$this->AggregateDayTags();
|
|
$this->AggregateDayGoals();
|
|
$this->AggregateDayEvents();
|
|
}
|
|
|
|
function AggregateSingleValues()
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_VISITORS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT COUNT(DISTINCT(`id`)) `uvisitors` FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed` > 0 AND `entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";"));
|
|
$this->VisitorsUnique = $row["uvisitors"];
|
|
|
|
for($i=0;$i<24;$i++)
|
|
{
|
|
$hour_delimiters = array(mktime($i,0,0,$this->Month,$this->Day,$this->Year),mktime($i,59,59,$this->Month,$this->Day,$this->Year));
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT COUNT(`id`) as `cvunique`,(SELECT COUNT(DISTINCT(`id`)) FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed` > 0 AND `js`=0 AND `entrance`>=" . DBManager::RealEscape($hour_delimiters[0]) . " AND `entrance`<=" . DBManager::RealEscape($hour_delimiters[1]) . ") as `json` FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `entrance`>=" . DBManager::RealEscape($hour_delimiters[0]) . " AND `entrance`<=" . DBManager::RealEscape($hour_delimiters[1]) . ";"));
|
|
|
|
$this->VisitorsUniqueHour = $row["cvunique"];
|
|
$this->JavascriptHour = $row["cvunique"]-$row["json"];
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT COUNT(`id`) as `cvrec` FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed` > 0 AND `visits`>1 AND `entrance`>=" . DBManager::RealEscape($hour_delimiters[0]) . " AND `entrance`<=" . DBManager::RealEscape($hour_delimiters[1]) . ";"));
|
|
$this->VisitorsRecurringHour = $row["cvrec"];
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT COUNT(`browser_id`) as `urls` FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` AS `t1` ON `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`url`=`t1`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` AS `t2` ON `t1`.`domain` = `t2`.`id` WHERE `t2`.`search`=0 AND `t2`.`external`=0 AND `entrance`>=" . DBManager::RealEscape($hour_delimiters[0]) . " AND `entrance`<=" . DBManager::RealEscape($hour_delimiters[1]) . ";"));
|
|
$this->PageImpressionsHour = $row["urls"];
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT COUNT(`id`) as `browsers`,(SELECT COUNT(`id`) FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSERS . "` WHERE is_chat=1 AND `created`>=" . DBManager::RealEscape($hour_delimiters[0]) . " AND `created`<=" . DBManager::RealEscape($hour_delimiters[1]) . ") as cpages FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSERS . "` WHERE `created`>=" . DBManager::RealEscape($hour_delimiters[0]) . " AND `overlay`=0 AND `created`<=" . DBManager::RealEscape($hour_delimiters[1]) . ";"));
|
|
$this->BrowserInstancesHour = $row["browsers"];
|
|
$this->ChatPagesHour = $row["cpages"];
|
|
$this->VisitorBouncesHour = DBManager::GetRowCount(DBManager::Execute(true, "SELECT COUNT(`visitor_id`) as `bvisitors` FROM `" . DB_PREFIX . DATABASE_VISITORS . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_BROWSERS . "` ON `" . DB_PREFIX . DATABASE_VISITORS . "`.`id`=`" . DB_PREFIX . DATABASE_VISITOR_BROWSERS . "`.`visitor_id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` ON `" . DB_PREFIX . DATABASE_VISITOR_BROWSERS . "`.`id`=`" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`browser_id` WHERE `" . DB_PREFIX . DATABASE_VISITOR_BROWSERS . "`.`overlay`=0 AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`closed` > 0 AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`>=" . DBManager::RealEscape($hour_delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`<=" . DBManager::RealEscape($hour_delimiters[1]) . " GROUP BY `visitor_id` HAVING `bvisitors`=1;"));
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT COUNT(*) AS `fseh` FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` AS `t1` ON `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`referrer`=`t1`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` AS `t2` ON `t1`.`domain` = `t2`.`id` WHERE `t2`.`search`=1 AND `t2`.`external`=1 AND `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`entrance`>=" . DBManager::RealEscape($hour_delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`entrance`<=" . DBManager::RealEscape($hour_delimiters[1]) . " AND `t2`.`domain`!='';"));
|
|
$this->FromSearchEngineHour = $row["fseh"];
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT COUNT(*) AS `frh` FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` AS `t1` ON `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`referrer`=`t1`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` AS `t2` ON `t1`.`domain` = `t2`.`id` WHERE `t2`.`search`=0 AND `t2`.`external`=1 AND `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`entrance`>=" . DBManager::RealEscape($hour_delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`entrance`<=" . DBManager::RealEscape($hour_delimiters[1]) . " AND `t2`.`domain`!='';"));
|
|
$this->FromReferrerHour = $row["frh"];
|
|
|
|
if($this->ChatPagesHour > 0 || $this->VisitorsUniqueHour > 0 || $this->PageImpressionsHour > 0 || $this->VisitorsRecurringHour > 0 || $this->VisitorBouncesHour > 0 || $this->FromSearchEngineHour > 0 || $this->FromReferrerHour > 0)
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_VISITORS . "` (`year`,`month`,`day`,`hour`,`visitors_unique`,`page_impressions`,`visitors_recurring`,`bounces`,`search_engine`,`from_referrer`,`browser_instances`,`js`,`on_chat_page`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($i) . "','" . DBManager::RealEscape($this->VisitorsUniqueHour) . "','" . DBManager::RealEscape($this->PageImpressionsHour) . "','" . DBManager::RealEscape($this->VisitorsRecurringHour) . "','" . DBManager::RealEscape($this->VisitorBouncesHour) . "','" . DBManager::RealEscape($this->FromSearchEngineHour) . "','" . DBManager::RealEscape($this->FromReferrerHour) . "','" . DBManager::RealEscape($this->BrowserInstancesHour) . "','" . DBManager::RealEscape($this->JavascriptHour) . "','" . DBManager::RealEscape($this->ChatPagesHour) . "');");
|
|
}
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT AVG(`closed`-`entrance`) as `avgs`,COUNT(`id`) as `cv` FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed` > 0 AND `entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";"));
|
|
$this->AVGTimeOnSiteTotal = (!empty($row["avgs"])) ? round($row["avgs"],4) : 0;
|
|
$this->VisitorsTotal = $row["cv"];
|
|
|
|
if(!StatisticProvider::$AllGoalsRequiredForConversion)
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT COUNT(DISTINCT(`t1`.`visitor_id`)) as `cvconv` FROM `" . DB_PREFIX . DATABASE_VISITOR_GOALS . "` as `t1` INNER JOIN `" . DB_PREFIX . DATABASE_GOALS . "` as `t2` ON `t1`.`goal_id`=`t2`.`id` WHERE `t2`.`conversion`=1 AND `t1`.`time`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `t1`.`time`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";"));
|
|
else
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT (SELECT COUNT(*) FROM `" . DB_PREFIX . DATABASE_GOALS . "` WHERE `conversion`=1) AS `tcount`, (SELECT COUNT(`visitor_id`) FROM (SELECT `visitor_id`, COUNT(`visitor_id`) as `vtcount` FROM `" . DB_PREFIX . DATABASE_VISITOR_GOALS . "` as `t1` INNER JOIN `" . DB_PREFIX . DATABASE_GOALS . "` as `t2` ON `t1`.`goal_id`=`t2`.`id` WHERE `t2`.`conversion`=1 AND `t1`.`time`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `t1`.`time`<=" . DBManager::RealEscape($this->Delimiters[1]) . " GROUP BY `t1`.`visitor_id`) AS `t3` WHERE `t3`.`vtcount`=`tcount`) as `cvconv`;"));
|
|
|
|
$this->ConversionsTotal = $row["cvconv"];
|
|
$time = SystemTime::GetMicroTime();
|
|
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS . "` SET `time`=" . $time[1] . ",`mtime`=" . $time[0] . ",`conversions`='" . DBManager::RealEscape($this->ConversionsTotal) . "',`sessions`=" . intval($this->VisitorsTotal) . ",`visitors_unique`='" . DBManager::RealEscape($this->VisitorsUnique) . "',`avg_time_site`='" . DBManager::RealEscape($this->AVGTimeOnSiteTotal) . "' WHERE" . $this->GetDateMatch() . ";");
|
|
}
|
|
|
|
function AggregateChats()
|
|
{
|
|
$values = array();
|
|
$ids = array();
|
|
$ndids = array();
|
|
$result = DBManager::Execute(true, $d = "SELECT `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.*,`" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.`status` AS `cstatus`,`vco`.`status` AS `inchatstatus`,`vco`.`user_id`,`vco`.`declined`,`vco`.`dtime`,`vco`.`jtime`,`vco`.`ltime`,`vco`.`alloc` FROM `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "` LEFT JOIN `" . DB_PREFIX . DATABASE_VISITOR_CHAT_OPERATORS . "` AS `vco` ON `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.`chat_id`=`vco`.`chat_id` WHERE (`" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.`status`>0 OR `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.`waiting`=1) AND `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.`first_active`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.`archive_created`>0 AND `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.`first_active`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";");
|
|
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if($row["status"] >= 2)
|
|
{
|
|
$elements = array();
|
|
if(!empty($row["jtime"]) || true)
|
|
{
|
|
if(!empty($row["user_id"]))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic(true))
|
|
$elements[$row["user_id"]] = $row["user_id"];
|
|
else
|
|
continue;
|
|
}
|
|
else if(!empty($row["request_group"]) && !empty($row["jtime"]))
|
|
foreach(Server::$Operators as $operator)
|
|
{
|
|
if(!$operator->AffectsStatistic(true))
|
|
continue;
|
|
|
|
$results = DBManager::Execute(true, "SELECT `internal_id` FROM `" . DB_PREFIX . DATABASE_OPERATOR_STATUS . "` WHERE `time`<=" . $row["last_active"] . " AND `confirmed`>=" . DBManager::RealEscape($row["last_active"]) . " AND `internal_id`='" . DBManager::RealEscape($operator->SystemId) . "' AND status<=1 LIMIT 1;");
|
|
if(DBManager::GetRowCount($results) > 0)
|
|
if(in_array($row["request_group"],$operator->Groups))
|
|
$elements[$operator->SystemId] = $operator->SystemId;
|
|
}
|
|
$elements[$row["request_group"]] = $row["request_group"];
|
|
}
|
|
|
|
foreach($elements as $elementid)
|
|
{
|
|
if($row["archive_created"]==2 && isset($ids[$row["chat_id"]]) && isset(Server::$Groups[$elementid]))
|
|
continue;
|
|
|
|
if(!isset($values[$elementid]))
|
|
$values[$elementid] = array();
|
|
if(!isset($values[$elementid][date("G",$row["first_active"])]))
|
|
$values[$elementid][date("G",$row["first_active"])] = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0);
|
|
|
|
if(empty($ndids[$elementid."-".$row["chat_id"]]))
|
|
$ndids[$elementid."-".$row["chat_id"]] = $row["chat_id"];
|
|
else
|
|
{
|
|
$values[$elementid][date("G",$row["first_active"])][0]-=1;
|
|
$values[$elementid][date("G",$row["first_active"])][1]-=($row["internal_active"]) ? 1 : 0;
|
|
$values[$elementid][date("G",$row["first_active"])][2]-=($row["internal_active"]) ? 0 : $row["internal_declined"];
|
|
}
|
|
|
|
if(empty($ids[$row["chat_id"]]))
|
|
$ids[$row["chat_id"]] = $row["chat_id"];
|
|
else if(isset(Server::$Operators[$elementid]))
|
|
$values[$elementid][date("G",$row["first_active"])][9]+=1;
|
|
|
|
$values[$elementid][date("G",$row["first_active"])][0]+=1;
|
|
$values[$elementid][date("G",$row["first_active"])][1]+=($row["internal_active"]) ? 1 : 0;
|
|
|
|
if(isset(Server::$Operators[$elementid]))
|
|
{
|
|
if($row["jtime"]==0)
|
|
$values[$elementid][date("G",$row["first_active"])][1]-=($row["internal_active"]) ? 1 : 0;
|
|
if($row["declined"]==1)
|
|
$values[$elementid][date("G",$row["first_active"])][2]+=1;
|
|
}
|
|
else
|
|
{
|
|
$values[$elementid][date("G",$row["first_active"])][2]+=($row["internal_active"]) ? 0 : $row["internal_declined"];
|
|
}
|
|
|
|
if($row["dtime"]>0)
|
|
$values[$elementid][date("G",$row["first_active"])][3]+=($row["dtime"]-$row["first_active"]);
|
|
else
|
|
$values[$elementid][date("G",$row["first_active"])][3]+=($row["allocated"]>0) ? ($row["allocated"]-$row["first_active"]) : $row["last_active"]-$row["first_active"];
|
|
|
|
if(!empty($row["internal_active"]) && empty($row["declined"]) && !empty($row["jtime"]))
|
|
{
|
|
$values[$elementid][date("G",$row["first_active"])][4]+=($row["allocated"]>0 && $row["last_active"]>$row["allocated"]) ? $row["last_active"]-$row["allocated"] : $row["last_active"]-$row["first_active"];
|
|
$values[$elementid][date("G",$row["first_active"])][5]+=1;
|
|
|
|
if(!empty($row["response_time"]))
|
|
$values[$elementid][date("G",$row["first_active"])][8]+=1;
|
|
}
|
|
$values[$elementid][date("G",$row["first_active"])][6]+=$row["response_time"];
|
|
$values[$elementid][date("G",$row["first_active"])][7]+=$row["chat_posts"];
|
|
}
|
|
}
|
|
}
|
|
|
|
$result = DBManager::Execute(true, "SELECT `request_group`,`first_active`,`request_operator` FROM `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "` WHERE (`request_operator`='' AND `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.`waiting`=1) AND `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.`first_active`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITOR_CHATS . "`.`first_active`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
$grid = $row["request_group"];
|
|
if(!isset($values[$grid][date("G",$row["first_active"])]))
|
|
$values[$grid][date("G",$row["first_active"])] = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0);
|
|
$values[$grid][date("G",$row["first_active"])][0]+=1;
|
|
}
|
|
|
|
$result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_CHAT_REQUESTS . "` WHERE `created`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `created`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
$senders = array($row["sender_system_id"],$row["sender_group_id"]);
|
|
foreach($senders as $sender)
|
|
{
|
|
if(!isset($values[$sender][date("G",$row["created"])]))
|
|
$values[$sender][date("G",$row["created"])] = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0);
|
|
$values[$sender][date("G",$row["created"])][10]+=1;
|
|
if(!empty($row["event_action_id"]))
|
|
$values[$sender][date("G",$row["created"])][11]+=1;
|
|
if(!empty($row["accepted"]))
|
|
$values[$sender][date("G",$row["created"])][12]+=1;
|
|
if(!empty($row["declined"]))
|
|
$values[$sender][date("G",$row["created"])][13]+=1;
|
|
}
|
|
}
|
|
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
foreach($values as $userid => $hours)
|
|
foreach($hours as $hour => $amount)
|
|
{
|
|
$gid = (isset(Server::$Groups[$userid])) ? $userid : "";
|
|
$uid = (isset(Server::$Operators[$userid])) ? $userid : "";
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` (`year`,`month`,`day`,`hour`,`user_id`,`group_id`,`amount`,`accepted`,`declined`,`avg_duration`,`avg_waiting_time`,`avg_response_time`,`chat_posts`,`multi`,`invites`,`invites_auto`,`invites_accepted`,`invites_declined`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($hour) . "','" . DBManager::RealEscape($uid) . "','" . DBManager::RealEscape($gid) . "','" . DBManager::RealEscape($amount[0]) . "','" . DBManager::RealEscape($amount[1]) . "','" . DBManager::RealEscape($amount[2]) . "','" . DBManager::RealEscape(Num::Divide($amount[4], $amount[5], 4)) . "','" . DBManager::RealEscape(Num::Divide($amount[3], $amount[0], 4)) . "','" . DBManager::RealEscape(Num::Divide($amount[6], $amount[8], 4)) . "','" . DBManager::RealEscape($amount[7]) . "','" . DBManager::RealEscape($amount[9]) . "','" . DBManager::RealEscape($amount[10]) . "','" . DBManager::RealEscape($amount[11]) . "','" . DBManager::RealEscape($amount[12]) . "','" . DBManager::RealEscape($amount[13]) . "');");
|
|
}
|
|
}
|
|
|
|
function AggregateTickets()
|
|
{
|
|
$values = array();
|
|
$result = DBManager::Execute(true, "SELECT `ti`.`target_group_id`,`tme`.`ticket_id`,`ted`.`editor_id`,`tme`.`created`,`ted`.`status` FROM `" . DB_PREFIX . DATABASE_TICKETS . "` AS `ti` LEFT JOIN `" . DB_PREFIX . DATABASE_TICKET_EDITORS . "` AS `ted` ON `ti`.`id`=`ted`.`ticket_id` INNER JOIN `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` AS `tme` ON `ti`.`id`=`tme`.`ticket_id` WHERE `tme`.`id`=`tme`.`ticket_id` AND `tme`.`created`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `tme`.`created`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
$operators = array();
|
|
if(!empty($row["editor_id"]))
|
|
$operators[$row["editor_id"]] = $row["editor_id"];
|
|
$operators[$row["target_group_id"]] = $row["target_group_id"];
|
|
|
|
foreach($operators as $request_operator)
|
|
{
|
|
$this->PrepareTicketHourArray($values,$request_operator,date("G",$row["created"]));
|
|
$values[$request_operator][date("G",$row["created"])]["amount"]+=1;
|
|
$values[$request_operator][date("G",$row["created"])]["open"]+= ((!empty($row["editor_id"]) && $row["status"]==0) ? 1 : 0);
|
|
$values[$request_operator][date("G",$row["created"])]["in_progress"]+= ((!empty($row["editor_id"]) && $row["status"]==1) ? 1 : 0);
|
|
$values[$request_operator][date("G",$row["created"])]["closed"]+= ((!empty($row["editor_id"]) && $row["status"]==2) ? 1 : 0);
|
|
$values[$request_operator][date("G",$row["created"])]["deleted"]+= ((!empty($row["editor_id"]) && $row["status"]==3) ? 1 : 0);
|
|
}
|
|
}
|
|
$lastTicket = "";
|
|
$results = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` WHERE `created`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `created`<=" . DBManager::RealEscape($this->Delimiters[1]) . " ORDER BY `ticket_id` ASC, `created` ASC;");
|
|
|
|
while($rows = DBManager::FetchArray($results))
|
|
{
|
|
if($lastTicket != $rows["ticket_id"])
|
|
{
|
|
$Ticket = new Ticket();
|
|
$Ticket->Id = $rows["ticket_id"];
|
|
$Ticket->Load();
|
|
|
|
if(count($Ticket->Messages) == 0)
|
|
continue;
|
|
|
|
$lastTicket = $Ticket->Id;
|
|
|
|
$Ticket->Created = $Ticket->Messages[0]->Created;
|
|
$openSpan = false;
|
|
}
|
|
|
|
foreach($Ticket->Messages as $message)
|
|
{
|
|
if($message->Type == 0 || $message->Type == 3 || $message->Type == 4)
|
|
{
|
|
$openSpan = $message->Created;
|
|
if(!empty($Ticket->Editor->Editor) && $rows["id"] == $message->Id)
|
|
{
|
|
$this->PrepareTicketHourArray($values,$Ticket->Editor->Editor,date("G",$rows["created"]));
|
|
$values[$Ticket->Editor->Editor][date("G",$rows["created"])]["messages"]+=1;
|
|
}
|
|
if(!empty($Ticket->Group) && $rows["id"] == $message->Id)
|
|
{
|
|
$this->PrepareTicketHourArray($values,$Ticket->Group,date("G",$rows["created"]));
|
|
$values[$Ticket->Group][date("G",$rows["created"])]["messages"]+=1;
|
|
}
|
|
else if(!empty($Ticket->Group) && $rows["id"] == $message->Id)
|
|
{
|
|
$this->PrepareTicketHourArray($values,$Ticket->Group,date("G",$rows["created"]));
|
|
$values[$Ticket->Group][date("G",$rows["created"])]["messages"]+=1;
|
|
}
|
|
}
|
|
else if(!empty($openSpan) && $message->Type == 1 && $rows["id"] == $message->Id)
|
|
{
|
|
if(!empty($Ticket->Editor))
|
|
{
|
|
$this->PrepareTicketHourArray($values,$Ticket->Editor->Editor,date("G",$rows["created"]));
|
|
$this->PrepareTicketHourArray($values,$Ticket->Group,date("G",$rows["created"]));
|
|
$values[$Ticket->Editor->Editor][date("G",$rows["created"])]["responses"] +=1;
|
|
$values[$Ticket->Editor->Editor][date("G",$rows["created"])]["response_time"] += ($rows["created"] - $openSpan);
|
|
$values[$Ticket->Group][date("G",$rows["created"])]["responses"] +=1;
|
|
$values[$Ticket->Group][date("G",$rows["created"])]["response_time"] += ($rows["created"] - $openSpan);
|
|
|
|
if($Ticket->Editor->Status == 2 && $Ticket->GetLastOutgoingMessageId() == $message->Id)
|
|
{
|
|
$values[$Ticket->Editor->Editor][date("G",$rows["created"])]["resolves"] += 1;
|
|
$values[$Ticket->Editor->Editor][date("G",$rows["created"])]["resolve_time"] += max($message->Created - $Ticket->Created,0);
|
|
$values[$Ticket->Group][date("G",$rows["created"])]["resolves"] += 1;
|
|
$values[$Ticket->Group][date("G",$rows["created"])]["resolve_time"] += max($message->Created - $Ticket->Created,0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_TICKETS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
foreach($values as $userid => $hours)
|
|
foreach($hours as $hour => $amount)
|
|
{
|
|
$groupid = (isset(Server::$Groups[$userid])) ? $userid : "";
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_TICKETS . "` (`year`,`month`,`day`,`hour`,`user_id`,`group_id`,`amount`,`open`,`in_progress`,`closed`,`deleted`,`messages`,`responses`,`avg_response_time`,`resolves`,`avg_resolve_time`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($hour) . "','" . DBManager::RealEscape($userid) . "','" . DBManager::RealEscape($groupid) . "','" . DBManager::RealEscape($amount["amount"]) . "','" . DBManager::RealEscape($amount["open"]) . "','" . DBManager::RealEscape($amount["in_progress"]) . "','" . DBManager::RealEscape($amount["closed"]) . "','" . DBManager::RealEscape($amount["deleted"]) . "','" . DBManager::RealEscape($amount["messages"]) . "','" . DBManager::RealEscape($amount["responses"]) . "','" . DBManager::RealEscape((Num::Divide($amount["response_time"], $amount["responses"], 4))) . "','" . DBManager::RealEscape($amount["resolves"]) . "','" . DBManager::RealEscape(Num::Divide($amount["resolve_time"], $amount["resolves"], 4)) . "');");
|
|
}
|
|
}
|
|
|
|
function AggregateFeedbacks()
|
|
{
|
|
Server::InitDataBlock(array("DBCONFIG"));
|
|
$result = DBManager::Execute(true, $d = "SELECT * FROM `" . DB_PREFIX . DATABASE_FEEDBACKS . "` AS `fb` INNER JOIN `" . DB_PREFIX . DATABASE_FEEDBACK_CRITERIA . "` AS `fc` ON `fb`.`id`=`fc`.`fid` WHERE `fb`.`operator_id` != '' AND `fb`.`group_id` != '' AND `fb`.`created`>='" . DBManager::RealEscape($this->Delimiters[0]) . "' AND `fb`.`created`<=" . DBManager::RealEscape($this->Delimiters[1]) . " ORDER BY `fb`.`id` ASC;");
|
|
$values = array("operator_id"=>array(),"group_id"=>array());
|
|
$currentFeedback = "";
|
|
$up = false;
|
|
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if($currentFeedback != $row["id"])
|
|
$up = true;
|
|
|
|
foreach($values as $typekey => $x)
|
|
{
|
|
if(empty($values[$typekey][$row[$typekey]]))
|
|
{
|
|
$values[$typekey][$row[$typekey]] = FeedbackCriteria::GetStatArray();
|
|
$values[$typekey][$row[$typekey]]["amount"]=0;
|
|
}
|
|
|
|
if(isset($values[$typekey][$row[$typekey]][$row["cid"]]))
|
|
{
|
|
$values[$typekey][$row[$typekey]][$row["cid"]] += $row["value"];
|
|
}
|
|
|
|
if($up)
|
|
$values[$typekey][$row[$typekey]]["amount"]++;
|
|
}
|
|
$currentFeedback = $row["id"];
|
|
$up = false;
|
|
}
|
|
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_FEEDBACKS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
foreach($values as $tarray)
|
|
foreach($tarray as $elementid => $cvalues)
|
|
{
|
|
$gid = (isset(Server::$Groups[$elementid])) ? $elementid : "";
|
|
$uid = (isset(Server::$Operators[$elementid])) ? $elementid : "";
|
|
|
|
$nvalues = array();
|
|
foreach($cvalues as $avg)
|
|
$nvalues[] = $avg;
|
|
while(count($nvalues)<5)
|
|
$nvalues[] = 0;
|
|
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_FEEDBACKS . "` (`year`,`month`,`day`,`operator_id`,`group_id`,`amount`,`ca`,`cb`,`cc`,`cd`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($uid) . "','" . DBManager::RealEscape($gid) . "','" . DBManager::RealEscape($nvalues[4]) . "','" . DBManager::RealEscape($nvalues[0]) . "','" . DBManager::RealEscape($nvalues[1]) . "','" . DBManager::RealEscape($nvalues[2]) . "','" . DBManager::RealEscape($nvalues[3]) . "');");
|
|
}
|
|
}
|
|
|
|
function AggregateOperatorTime()
|
|
{
|
|
global $ONTIME;
|
|
$ONTIME = array();
|
|
$result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_OPERATOR_STATUS . "` WHERE `time`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `time`<=" . DBManager::RealEscape($this->Delimiters[1]) . " AND `status`<" . USER_STATUS_OFFLINE . " ORDER BY `time`,`confirmed` ASC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(!isset($ONTIME[$row["internal_id"]]))
|
|
{
|
|
$ONTIME[$row["internal_id"]][USER_STATUS_ONLINE] = array(0=>0,1=>0,2=>0,3=>0,4=>0,5=>0,6=>0,7=>0,8=>0,9=>0,10=>0,11=>0,12=>0,13=>0,14=>0,15=>0,16=>0,17=>0,18=>0,19=>0,20=>0,21=>0,22=>0,23=>0);
|
|
$ONTIME[$row["internal_id"]][USER_STATUS_BUSY] = array(0=>0,1=>0,2=>0,3=>0,4=>0,5=>0,6=>0,7=>0,8=>0,9=>0,10=>0,11=>0,12=>0,13=>0,14=>0,15=>0,16=>0,17=>0,18=>0,19=>0,20=>0,21=>0,22=>0,23=>0);
|
|
}
|
|
$ONTIME[$row["internal_id"]][$row["status"]][date("G",$row["time"])]+=max($row["confirmed"]-$row["time"],0);
|
|
}
|
|
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_AVAILABILITIES . "` WHERE" . $this->GetDateMatch() . ";");
|
|
foreach($ONTIME as $userid => $states)
|
|
foreach($states as $status => $hours)
|
|
foreach($hours as $hour => $amount)
|
|
if($amount > 0)
|
|
{
|
|
$gid = (isset(Server::$Groups[$userid])) ? $userid : "";
|
|
$uid = (isset(Server::$Operators[$userid]) || $userid=="everyoneintern") ? $userid : "";
|
|
if(!empty($gid) || !empty($uid))
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_AVAILABILITIES . "` (`year`,`month`,`day`,`hour`,`user_id`,`group_id`,`status`,`seconds`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($hour) . "','" . DBManager::RealEscape($uid) . "','" . DBManager::RealEscape($gid) . "','" . DBManager::RealEscape($status) . "','" . DBManager::RealEscape($amount) . "');");
|
|
}
|
|
}
|
|
|
|
function AggregateValueCount($_table,$_sourceTable,$_valueField,$_delimiterField,$_unique=false)
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . $_table . "` WHERE" . $this->GetDateMatch() . ";");
|
|
$result = DBManager::Execute(true, "SELECT `" . $_valueField . "` , count( `" . $_valueField . "` ) AS `vamount` FROM `" . $_sourceTable . "` WHERE `" . $_valueField . "`!='0' AND `" . $_delimiterField . "`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . $_delimiterField . "`<=" . DBManager::RealEscape($this->Delimiters[1]) . " GROUP BY `" . $_valueField . "` ORDER BY `vamount` DESC LIMIT " . StatisticProvider::$DayItemAmount . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . $_table . "` (`year`,`month`,`day`,`" . $_valueField . "`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row[$_valueField]) . "','" . DBManager::RealEscape($row["vamount"]) . "');");
|
|
}
|
|
|
|
function AggregateDayPageCount($_table,$_field,$_countField,$_groupField)
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . $_table . "` WHERE" . $this->GetDateMatch() . ";");
|
|
$result = DBManager::Execute(true, "SELECT COUNT( " . $_countField . " ) AS `vamount`,`" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`url`,`t1`.`domain` AS `domain` FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_BROWSERS . "` AS `vb` ON `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`browser_id`=`vb`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` AS t1 ON `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`url`=t1.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` AS t2 ON t1.`domain` = t2.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_TITLES . "` AS t3 ON t1.`title` = t3.`id` WHERE `vb`.`is_chat`=0 AND t2.`search`=0 AND t2.`external`=0 AND t2.`domain`!='' AND `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . " GROUP BY " . $_groupField . " ORDER BY `vamount` DESC,`" . DB_PREFIX . "visitor_browser_urls`.`url` LIMIT " . (StatisticProvider::$DayItemAmount) . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . $_table . "` (`year`,`month`,`day`,`" . $_field . "`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row[$_field]) . "','" . DBManager::RealEscape($row["vamount"]) . "');");
|
|
}
|
|
|
|
function AggregateDayEntranceExitPageCount($_table,$_exit=false,$_secondaryGroupField="")
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . $_table . "` WHERE" . $this->GetDateMatch() . ";");
|
|
|
|
if(!$_exit)
|
|
$query = "SELECT SUM(`is_entrance`) as `pamount`,bu.url as urli FROM `".DB_PREFIX.DATABASE_VISITOR_BROWSER_URLS."` AS `bu` INNER JOIN `".DB_PREFIX.DATABASE_VISITOR_BROWSERS."` AS `vb` ON `bu`.`browser_id`=`vb`.`id` WHERE `vb`.`is_chat`=0 AND `entrance`>=".DBManager::RealEscape($this->Delimiters[0])." AND `entrance`<=".DBManager::RealEscape($this->Delimiters[1])." GROUP BY `urli` ORDER BY `pamount` DESC LIMIT ".(StatisticProvider::$DayItemAmount).";";
|
|
else
|
|
$query = "SELECT SUM(`is_exit`) as `pamount`,bu.url as urli FROM `".DB_PREFIX.DATABASE_VISITOR_BROWSER_URLS."` AS `bu` INNER JOIN `".DB_PREFIX.DATABASE_VISITOR_BROWSERS."` AS `vb` ON `bu`.`browser_id`=`vb`.`id` WHERE `vb`.`is_chat`=0 AND `vb`.`last_active` < ". (time()-StatisticProvider::$TimeoutTrack) . " AND `entrance`>=".DBManager::RealEscape($this->Delimiters[0])." AND `entrance`<=".DBManager::RealEscape($this->Delimiters[1])." GROUP BY `urli` ORDER BY `pamount` DESC LIMIT ".(StatisticProvider::$DayItemAmount).";";
|
|
|
|
$result = DBManager::Execute(true, $query);
|
|
while($row = DBManager::FetchArray($result))
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . $_table . "` (`year`,`month`,`day`,`url`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row["urli"]) . "','" . DBManager::RealEscape($row["pamount"]) . "');");
|
|
}
|
|
|
|
function AggregateDayReferrerCount($_table)
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . $_table . "` WHERE" . $this->GetDateMatch() . ";");
|
|
$result = DBManager::Execute(true, "SELECT COUNT( `t1`.`path` ) AS `vamount`,`" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`referrer` FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` AS t1 ON `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`referrer`=t1.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` AS t2 ON t1.`domain` = t2.`id` WHERE t2.`search`=0 AND t2.`external`=1 AND t2.`domain`!='' AND `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . " GROUP BY `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`referrer` ORDER BY `vamount` DESC LIMIT " . (StatisticProvider::$DayItemAmount) . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . $_table . "` (`year`,`month`,`day`,`referrer`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row["referrer"]) . "','" . DBManager::RealEscape($row["vamount"]) . "');");
|
|
}
|
|
|
|
function AggregateDaySearchEngineCount($_table)
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . $_table . "` WHERE" . $this->GetDateMatch() . ";");
|
|
$result = DBManager::Execute(true, $d = "SELECT COUNT( `t1`.`path` ) AS `vamount`,`t1`.`domain` FROM `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` AS `t1` ON `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`referrer`=`t1`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` AS `t2` ON `t1`.`domain`=`t2`.`id` WHERE `t2`.`search`=1 AND `t2`.`external`=1 AND `t2`.`domain`!='' AND `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITOR_BROWSER_URLS . "`.`entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . " GROUP BY `t1`.`domain` ORDER BY `vamount` DESC LIMIT " . (StatisticProvider::$DayItemAmount) . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . $_table . "` (`year`,`month`,`day`,`domain`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row["domain"]) . "','" . DBManager::RealEscape($row["vamount"]) . "');");
|
|
}
|
|
|
|
function AggregateTags($result, $type)
|
|
{
|
|
$tags = array();
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
$tags_array = explode(',', $row['tags']);
|
|
foreach ($tags_array as $index => $tag)
|
|
{
|
|
if(array_key_exists($tag,$tags))
|
|
$tags[$tag] = $tags[$tag] + 1;
|
|
else
|
|
$tags[$tag] = 1;
|
|
}
|
|
}
|
|
|
|
foreach($tags as $tag => $amount)
|
|
{
|
|
if($tag != '')
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_TAGS . "` (`year`,`month`,`day`,`tag`,`amount`,`type`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($tag) . "','" . DBManager::RealEscape($amount) . "','" . DBManager::RealEscape($type) . "');");
|
|
}
|
|
}
|
|
|
|
function AggregateDayTags()
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_TAGS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
|
|
$chatTags = DBManager::Execute(true, "SELECT `tags` FROM `" . DB_PREFIX . DATABASE_CHAT_ARCHIVE . "` WHERE `time`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `time`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";");
|
|
self::AggregateTags($chatTags, 0);
|
|
|
|
$ticketTags = DBManager::Execute(true, "SELECT `ti`.`tags` FROM `" . DB_PREFIX . DATABASE_TICKETS . "` AS `ti` INNER JOIN `" . DB_PREFIX . DATABASE_TICKET_MESSAGES . "` AS `tme` ON `ti`.`id`=`tme`.`ticket_id` WHERE `tme`.`id`=`tme`.`ticket_id` AND `tme`.`created`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `tme`.`created`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";");
|
|
self::AggregateTags($ticketTags, 1);
|
|
|
|
}
|
|
|
|
function AggregateDayGoals()
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_GOALS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_GOALS_QUERIES . "` WHERE" . $this->GetDateMatch() . ";");
|
|
|
|
$result = DBManager::Execute(true, "SELECT `goal_id`, COUNT(`goal_id`) as `tamount` FROM `" . DB_PREFIX . DATABASE_VISITOR_GOALS . "` WHERE `time`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `time`<=" . DBManager::RealEscape($this->Delimiters[1]) . " GROUP BY `goal_id` ORDER BY `tamount` DESC LIMIT " . StatisticProvider::$DayItemAmount . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_GOALS . "` (`year`,`month`,`day`,`goal`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row["goal_id"]) . "','" . DBManager::RealEscape($row["tamount"]) . "');");
|
|
$results = DBManager::Execute(true, "SELECT `goal_id`,`t1`.`query`,COUNT(`t1`.`query`) as `qamount` FROM `" . DB_PREFIX . DATABASE_VISITOR_GOALS . "` AS `t1` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_QUERIES . "` AS `t2` ON `t1`.`query`=`t2`.`id` WHERE `t2`.`query` != '' AND `goal_id`='" . DBManager::RealEscape($row["goal_id"]) . "' GROUP BY `t1`.`query` ORDER BY `qamount` DESC LIMIT " . StatisticProvider::$DayItemAmount . ";");
|
|
while($rows = DBManager::FetchArray($results))
|
|
{
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_GOALS_QUERIES . "` (`year`,`month`,`day`,`goal`,`query`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($rows["goal_id"]) . "','" . DBManager::RealEscape($rows["query"]) . "','" . DBManager::RealEscape($rows["qamount"]) . "');");
|
|
}
|
|
}
|
|
}
|
|
|
|
function AggregateDayEvents()
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_EVENTS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
for($i=0;$i<24;$i++)
|
|
{
|
|
$hour_delimiters = array(mktime($i,0,0,$this->Month,$this->Day,$this->Year),mktime($i,59,59,$this->Month,$this->Day,$this->Year));
|
|
$result = DBManager::Execute(true, $d = "SELECT `event_id` FROM `" . DB_PREFIX . DATABASE_EVENT_TRIGGERS . "` WHERE `event_id`!='' AND `time`>=" . DBManager::RealEscape($hour_delimiters[0]) . " AND `time`<=" . DBManager::RealEscape($hour_delimiters[1]) . " GROUP BY `receiver_user_id`,`receiver_browser_id`,`event_id` DESC LIMIT " . StatisticProvider::$DayItemAmount . ";");
|
|
$eventIds = array();
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(!isset($eventIds[$row["event_id"]]))
|
|
$eventIds[$row["event_id"]] = 0;
|
|
|
|
$eventIds[$row["event_id"]]++;
|
|
}
|
|
foreach($eventIds as $eid => $count)
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_EVENTS . "` (`year`,`month`,`day`,`hour`,`event_id`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",".$i.",'" . DBManager::RealEscape($eid) . "','" . DBManager::RealEscape($count) . "');");
|
|
}
|
|
}
|
|
|
|
function AggregateKnowledgebase()
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_QUERIES . "` WHERE" . $this->GetDateMatch() . " AND `type`=1;");
|
|
$result = DBManager::Execute(true, "SELECT `query`, COUNT(`query`) as `qamount` FROM `" . DB_PREFIX . DATABASE_KNOWLEDGEBASE_QUERIES . "` WHERE `time`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `time`<=" . DBManager::RealEscape($this->Delimiters[1]) . " GROUP BY `query` ORDER BY `qamount` DESC LIMIT " . StatisticProvider::$DayItemAmount . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_QUERIES . "` (`year`,`month`,`day`,`query`,`amount`,`type`) VALUES (" . $this->GetSQLDateValues() . "," . intval($row["query"]) . "," . intval($row["qamount"]) . ",1);");
|
|
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` WHERE" . $this->GetDateMatch() . ";");
|
|
$result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_KNOWLEDGEBASE_VIEWS . "` WHERE `time`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `time`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` (`year`,`month`,`day`,`res_id`,`views`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row["res_id"]) . "',1);");
|
|
if(DBManager::GetAffectedRowCount() <= 0)
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` SET `views`=`views`+1 WHERE" . $this->GetDateMatch() . " AND `res_id`='" . DBManager::RealEscape($row["res_id"]) . "' LIMIT 1;");
|
|
}
|
|
$result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_FEEDBACKS . "` AS `t1` INNER JOIN `" . DB_PREFIX . DATABASE_FEEDBACK_CRITERIA . "` AS `t2` ON `t1`.`id`=`t2`.`fid` WHERE `t2`.`cid`='hf' AND `t1`.`resource_id` != '' AND `t1`.`created`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `t1`.`created`<=" . DBManager::RealEscape($this->Delimiters[1]) . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` (`year`,`month`,`day`,`res_id`,`rate_amount`,`rate_positive`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($row["resource_id"]) . "',1," . intval(!empty($row["value"]) ? 1 : 0) . ");");
|
|
if(DBManager::GetAffectedRowCount() <= 0)
|
|
{
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` SET `rate_amount`=`rate_amount`+1 WHERE" . $this->GetDateMatch() . " AND `res_id`='" . DBManager::RealEscape($row["resource_id"]) . "' LIMIT 1;");
|
|
|
|
if(!empty($row["value"]))
|
|
DBManager::Execute(true, "UPDATE `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` SET `rate_positive`=`rate_positive`+1 WHERE" . $this->GetDateMatch() . " AND `res_id`='" . DBManager::RealEscape($row["resource_id"]) . "' LIMIT 1;");
|
|
}
|
|
}
|
|
}
|
|
|
|
function AggregateDurations()
|
|
{
|
|
$result = DBManager::Execute(true, "SELECT
|
|
(SELECT count((id)) FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed`>0 AND (`closed`-`entrance`)>=3600 AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . ") as `A7`,
|
|
(SELECT count((id)) FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed`>0 AND (`closed`-`entrance`)<3600 AND (`closed`-`entrance`)>=1800 AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . ") as `A6`,
|
|
(SELECT count((id)) FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed`>0 AND (`closed`-`entrance`)<1800 AND (`closed`-`entrance`)>=900 AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . ") as `A5`,
|
|
(SELECT count((id)) FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed`>0 AND (`closed`-`entrance`)<900 AND (`closed`-`entrance`)>=600 AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . ") as `A4`,
|
|
(SELECT count((id)) FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed`>0 AND (`closed`-`entrance`)<600 AND (`closed`-`entrance`)>=300 AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . ") as `A3`,
|
|
(SELECT count((id)) FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed`>0 AND (`closed`-`entrance`)<300 AND (`closed`-`entrance`)>=60 AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . ") as `A2`,
|
|
(SELECT count((id)) FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed`>0 AND (`closed`-`entrance`)<60 AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`>=" . DBManager::RealEscape($this->Delimiters[0]) . " AND `" . DB_PREFIX . DATABASE_VISITORS . "`.`entrance`<=" . DBManager::RealEscape($this->Delimiters[1]) . ") as `A1`
|
|
FROM `" . DB_PREFIX . DATABASE_VISITORS . "`;");
|
|
$row = DBManager::FetchArray($result);
|
|
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_DURATIONS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
for($int=1;$int<8;$int++)
|
|
if(!empty($row["A".$int]))
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS_DURATIONS . "` (`year`,`month`,`day`,`duration`,`amount`) VALUES (" . $this->GetSQLDateValues() . ",'" . DBManager::RealEscape($int) . "','" . DBManager::RealEscape($row["A" . $int]) . "');");
|
|
}
|
|
}
|
|
|
|
class StatisticPeriod
|
|
{
|
|
public $DayCount;
|
|
public $Delimiters;
|
|
public $Day = 0;
|
|
public $Month = 0;
|
|
public $Year;
|
|
public $Loaded = false;
|
|
public $ConversionsTotal;
|
|
public $VisitorsUniqueHour;
|
|
public $VisitorsTotal;
|
|
public $VisitorsUnique;
|
|
public $VisitorsRecurringHour;
|
|
public $VisitorsRecurringTotal;
|
|
public $PageImpressionsHour = 0;
|
|
public $PageImpressionsTotal = 0;
|
|
public $AVGTimeOnSiteTotal = 0;
|
|
public $AVGTimeOnPageTotal = 0;
|
|
public $AVGTimeInChat = 0;
|
|
public $AVGWaitingTime = 0;
|
|
public $AVGPagesTotal = 0;
|
|
public $AVGTicketResponseTime = 0;
|
|
public $AVGTicketResolveTime = 0;
|
|
public $VisitorBouncesHour = 0;
|
|
public $VisitorBouncesTotal = 0;
|
|
public $ChatsTotal = 0;
|
|
public $TicketsTotal = 0;
|
|
public $ChatsPagesTotal = 0;
|
|
public $ChatsPagesHour = 0;
|
|
public $ChatsDeclinedTotal = 0;
|
|
public $ChatsAcceptedTotal = 0;
|
|
public $ChatsMissedTotal = 0;
|
|
public $FromSearchEngineHour = 0;
|
|
public $FromSearchEngineTotal = 0;
|
|
public $FromReferrerHour = 0;
|
|
public $FromReferrerTotal = 0;
|
|
public $ChatAvailabilitySpans;
|
|
public $ChatAvailabilityTotal = 0;
|
|
public $BrowserInstancesTotal = 0;
|
|
public $ChatPagesTotal = 0;
|
|
public $BrowserInstancesHour = 0;
|
|
public $AVGBrowserInstances = 0;
|
|
public $JavascriptTotal = 0;
|
|
public $JavascriptHour = 0;
|
|
public $QueryAmountTotal = 0;
|
|
public $DirectAccessTotal = 0;
|
|
public $CrawlerAccessTotal = 0;
|
|
public $KnowledgebaseQueryAmountTotal = 0;
|
|
public $Microtime = 0;
|
|
public $Aggregated = 0;
|
|
public $TCP = 0;
|
|
public $Tops;
|
|
public $Type;
|
|
public $TopVisitorTables;
|
|
public $TopBrowserURLTables;
|
|
public $Closed;
|
|
public $Days;
|
|
public $Months;
|
|
public $CreateReport;
|
|
public $CreateVisitorList;
|
|
public $IncludeBHVisitors;
|
|
public $IncludeBHChats;
|
|
public $IncludeBDVisitors;
|
|
public $IncludeBDChats;
|
|
public $IncludeBMVisitors;
|
|
public $IncludeBMChats;
|
|
public $IncludeBOAvailability;
|
|
public $IncludeBOChats;
|
|
public $IncludeBOFeedbacks;
|
|
public $IncludeBOTickets;
|
|
public $IncludeBOInvites;
|
|
public $IncludeTOPSystems;
|
|
public $IncludeTOPOrigins;
|
|
public $IncludeTOPVisits;
|
|
public $IncludeTOPISPs;
|
|
public $IncludeTOPPages;
|
|
public $IncludeTOPEntranceExit;
|
|
public $IncludeTOPSearch;
|
|
public $IncludeTOPReferrers;
|
|
public $IncludeTOPDomains;
|
|
public $IncludeTOPKnowledgebase;
|
|
|
|
function __construct($_year,$_month,$_day,$_aggregated,$_microtime)
|
|
{
|
|
$this->Year = $_year;
|
|
$this->Month = $_month;
|
|
$this->Day = $_day;
|
|
$this->Aggregated = $_aggregated;
|
|
$this->Microtime = $_microtime;
|
|
$this->TopVisitorTables = array(DATABASE_STATS_AGGS_BROWSERS=>"browser",DATABASE_STATS_AGGS_RESOLUTIONS=>"resolution",DATABASE_STATS_AGGS_VISITS=>"visits",DATABASE_STATS_AGGS_COUNTRIES=>"country",DATABASE_STATS_AGGS_SYSTEMS=>"system",DATABASE_STATS_AGGS_LANGUAGES=>"language",DATABASE_STATS_AGGS_CITIES=>"city",DATABASE_STATS_AGGS_REGIONS=>"region",DATABASE_STATS_AGGS_ISPS=>"isp");
|
|
$this->TopBrowserURLTables = array(DATABASE_STATS_AGGS_REFERRERS=>"referrer",DATABASE_STATS_AGGS_PAGES=>"url",DATABASE_STATS_AGGS_PAGES_EXIT=>"url",DATABASE_STATS_AGGS_PAGES_ENTRANCE=>"url",DATABASE_STATS_AGGS_SEARCH_ENGINES=>"domain");
|
|
}
|
|
|
|
function GetNoneAggregatedDateMatch()
|
|
{
|
|
if($this->Type == STATISTIC_PERIOD_TYPE_DAY)
|
|
$_sql = " `day`='".DBManager::RealEscape($this->Day)."' AND `month`='".DBManager::RealEscape($this->Month)."' AND `year`='".DBManager::RealEscape($this->Year)."'";
|
|
else if($this->Type == STATISTIC_PERIOD_TYPE_MONTH)
|
|
$_sql = " `month`='".DBManager::RealEscape($this->Month)."' AND `year`='".DBManager::RealEscape($this->Year)."'";
|
|
else
|
|
$_sql = " `year`='".DBManager::RealEscape($this->Year)."'";
|
|
return $_sql;
|
|
}
|
|
|
|
function GetDateMatch($_year=true,$_month=true,$_day=true,$_sql="")
|
|
{
|
|
if($_day)$_sql .= " `day`='".DBManager::RealEscape(($this->Type == STATISTIC_PERIOD_TYPE_DAY) ? $this->Day : 0)."'";
|
|
if($_month)$_sql .= ((!empty($_sql))?" AND":"") . " `month`='".DBManager::RealEscape(($this->Type != STATISTIC_PERIOD_TYPE_YEAR) ? $this->Month : 0)."'";
|
|
if($_year)$_sql .= ((!empty($_sql))?" AND":"") . " `year`='".DBManager::RealEscape($this->Year)."'";
|
|
return $_sql;
|
|
}
|
|
|
|
function GetSQLDateValues()
|
|
{
|
|
if($this->Type == STATISTIC_PERIOD_TYPE_DAY)
|
|
return "'".DBManager::RealEscape($this->Year)."','".DBManager::RealEscape($this->Month)."','".DBManager::RealEscape($this->Day)."'";
|
|
else if($this->Type == STATISTIC_PERIOD_TYPE_MONTH)
|
|
return "'".DBManager::RealEscape($this->Year)."','".DBManager::RealEscape($this->Month)."','".DBManager::RealEscape(0)."'";
|
|
else
|
|
return "'".DBManager::RealEscape($this->Year)."','".DBManager::RealEscape(0)."','".DBManager::RealEscape(0)."'";
|
|
}
|
|
|
|
function Load()
|
|
{
|
|
$result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE" . $this->GetDateMatch() . ";");
|
|
if(DBManager::GetRowCount($result)===1)
|
|
{
|
|
$this->Loaded = true;
|
|
$row = DBManager::FetchArray($result);
|
|
$this->AVGTimeOnSiteTotal = $row["avg_time_site"];
|
|
$this->VisitorsTotal = $row["sessions"];
|
|
$this->VisitorsUnique = $row["visitors_unique"];
|
|
$this->ConversionsTotal = $row["conversions"];
|
|
|
|
$resultc = DBManager::Execute(true, "SELECT SUM(`amount`) AS `csam`,SUM(`multi`) AS `csmu`,SUM(`declined`) AS `csde`,SUM(`accepted`) AS `csac` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!='';");
|
|
if($rowc = DBManager::FetchArray($resultc))
|
|
{
|
|
$this->ChatsTotal = abs($rowc["csam"]);
|
|
$this->ChatsDeclinedTotal = abs($rowc["csde"]);
|
|
$this->ChatsAcceptedTotal = abs($rowc["csac"]);
|
|
$this->ChatsMissedTotal = abs(($rowc["csam"])-($rowc["csde"]+$rowc["csac"]));
|
|
}
|
|
|
|
$resultc = DBManager::Execute(true, "SELECT avg_duration,avg_waiting_time,amount FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!='';");
|
|
while($rowc = DBManager::FetchArray($resultc))
|
|
{
|
|
$this->AVGTimeInChat += abs($rowc["avg_duration"]*$rowc["amount"]);
|
|
$this->AVGWaitingTime += abs($rowc["avg_waiting_time"]*$rowc["amount"]);
|
|
}
|
|
|
|
if(!empty($this->ChatsTotal))
|
|
{
|
|
$this->AVGWaitingTime = Num::Divide($this->AVGWaitingTime,$this->ChatsTotal,false,true);
|
|
$this->AVGTimeInChat = Num::Divide($this->AVGTimeInChat,$this->ChatsTotal,false,true);
|
|
}
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT SUM(`seconds`) AS `avail` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_AVAILABILITIES . "` WHERE `user_id`='everyoneintern' AND" . $this->GetNoneAggregatedDateMatch() . ";"));
|
|
$this->ChatAvailabilityTotal = $row["avail"];
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT SUM(`amount`) AS `ttickets`, SUM(`responses`) AS `tresponses`, SUM(`avg_response_time`*`responses`) AS `tavgresponses`, SUM(`resolves`) AS `tresolves`, SUM(`avg_resolve_time`*`resolves`) AS `tavgresolves` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_TICKETS . "` WHERE `group_id` != '' AND" . $this->GetNoneAggregatedDateMatch() . ";"));
|
|
$this->TicketsTotal = $row["ttickets"];
|
|
$this->AVGTicketResponseTime = $row["tavgresponses"]/max($row["tresponses"],1);
|
|
$this->AVGTicketResolveTime = $row["tavgresolves"]/max($row["tresolves"],1);
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT SUM(`amount`) AS `queries` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_QUERIES . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_QUERIES . "` ON `" . DB_PREFIX . DATABASE_STATS_AGGS_QUERIES . "`.query=`" . DB_PREFIX . DATABASE_VISITOR_DATA_QUERIES . "`.id WHERE`" . DB_PREFIX . DATABASE_VISITOR_DATA_QUERIES . "`.`query`!='' AND `" . DB_PREFIX . DATABASE_STATS_AGGS_QUERIES . "`.`type`=0 AND" . $this->GetDateMatch() . ";"));
|
|
$this->QueryAmountTotal = $row["queries"];
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT SUM(`amount`) AS `queries` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_QUERIES . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_QUERIES . "` ON `" . DB_PREFIX . DATABASE_STATS_AGGS_QUERIES . "`.query=`" . DB_PREFIX . DATABASE_VISITOR_DATA_QUERIES . "`.id WHERE`" . DB_PREFIX . DATABASE_VISITOR_DATA_QUERIES . "`.`query`!='' AND `" . DB_PREFIX . DATABASE_STATS_AGGS_QUERIES . "`.`type`=1 AND" . $this->GetDateMatch() . ";"));
|
|
$this->KnowledgebaseQueryAmountTotal = $row["queries"];
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT SUM(`amount`) AS `crawlers` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CRAWLERS . "` WHERE" . $this->GetDateMatch() . ";"));
|
|
$this->CrawlerAccessTotal = $row["crawlers"];
|
|
|
|
if($this->VisitorsTotal > 0)
|
|
{
|
|
$this->AVGPagesTotal = Num::Divide($this->PageImpressionsTotal,$this->VisitorsTotal,StatisticProvider::$RoundPrecision);
|
|
$this->AVGBrowserInstances = Num::Divide($this->BrowserInstancesTotal,$this->VisitorsTotal,StatisticProvider::$RoundPrecision);
|
|
}
|
|
if($this->AVGTimeOnSiteTotal > 0 && $this->AVGPagesTotal > 0)
|
|
$this->AVGTimeOnPageTotal = Num::Divide($this->AVGTimeOnSiteTotal,$this->AVGPagesTotal,4);
|
|
|
|
$this->DirectAccessTotal = $this->VisitorsTotal-$this->FromReferrerTotal-$this->FromSearchEngineTotal;
|
|
$this->TCP = round($this->PageImpressionsTotal*0.50 / 1000,4);
|
|
$this->LoadTopTable(3,100,array(DATABASE_STATS_AGGS_QUERIES,DATABASE_VISITOR_DATA_QUERIES),array("query","query")," AND `".DB_PREFIX.DATABASE_STATS_AGGS_QUERIES."`.`type`=0",$this->QueryAmountTotal);
|
|
$this->LoadTopTable(0,32,array(DATABASE_STATS_AGGS_BROWSERS,DATABASE_VISITOR_DATA_BROWSERS),array("browser","browser"),true,$this->VisitorsTotal);
|
|
$this->LoadTopTable(1,32,array(DATABASE_STATS_AGGS_SYSTEMS,DATABASE_VISITOR_DATA_SYSTEMS),array("system","system"),true,$this->VisitorsTotal);
|
|
$this->LoadTopTable(2,32,array(DATABASE_STATS_AGGS_COUNTRIES),array("country","country"),true,$this->VisitorsTotal);
|
|
$this->LoadTopTable(4,32,array(DATABASE_STATS_AGGS_CITIES,DATABASE_VISITOR_DATA_CITIES),array("city","city"),true,$this->VisitorsTotal);
|
|
$this->LoadTopTable(5,32,array(DATABASE_STATS_AGGS_RESOLUTIONS,DATABASE_VISITOR_DATA_RESOLUTIONS),array("resolution","resolution"),true,$this->VisitorsTotal);
|
|
$this->LoadTopTable(6,32,array(DATABASE_STATS_AGGS_LANGUAGES),array("language","language"),true,$this->VisitorsTotal);
|
|
$this->LoadTopTable(7,32,array(DATABASE_STATS_AGGS_REGIONS,DATABASE_VISITOR_DATA_REGIONS),array("region","region"),true,$this->VisitorsTotal);
|
|
$this->LoadTopTable(11,32,array(DATABASE_STATS_AGGS_VISITS),array("visits","visits"),true,$this->VisitorsTotal,false);
|
|
$this->LoadTopTable(12,100,array(DATABASE_STATS_AGGS_ISPS,DATABASE_VISITOR_DATA_ISPS),array("isp","isp"),true,$this->VisitorsTotal,false);
|
|
$this->LoadTopTable(16,100,array(DATABASE_STATS_AGGS_CRAWLERS,DATABASE_VISITOR_DATA_CRAWLERS),array("crawler","crawler"),true,$this->CrawlerAccessTotal,false);
|
|
$this->LoadTopTable(13,32,array(DATABASE_STATS_AGGS_DURATIONS),array("duration","duration"),true,$this->VisitorsTotal,false,"amount","duration","ASC");
|
|
$this->LoadTopTable(14,100,array(DATABASE_STATS_AGGS_DOMAINS,DATABASE_VISITOR_DATA_DOMAINS),array("domain","domain"),true,$this->PageImpressionsTotal);
|
|
$this->LoadURLTable(DATABASE_STATS_AGGS_PAGES,9,90,false,$this->PageImpressionsTotal);
|
|
$this->LoadURLTable(DATABASE_STATS_AGGS_PAGES,10,90,true,$this->PageImpressionsTotal);
|
|
$this->LoadURLTable(DATABASE_STATS_AGGS_PAGES_ENTRANCE,17,90,false,$this->BrowserInstancesTotal-$this->ChatPagesTotal);
|
|
$this->LoadURLTable(DATABASE_STATS_AGGS_PAGES_ENTRANCE,18,90,true,$this->BrowserInstancesTotal-$this->ChatPagesTotal);
|
|
$this->LoadURLTable(DATABASE_STATS_AGGS_PAGES_EXIT,19,90,false,$this->BrowserInstancesTotal-$this->ChatPagesTotal);
|
|
$this->LoadURLTable(DATABASE_STATS_AGGS_PAGES_EXIT,20,90,true,$this->BrowserInstancesTotal-$this->ChatPagesTotal);
|
|
$this->LoadReferrerTable(30,80,DATABASE_STATS_AGGS_REFERRERS,true,$this->FromReferrerTotal);
|
|
$this->LoadReferrerTable(31,80,DATABASE_STATS_AGGS_REFERRERS,false,$this->FromReferrerTotal,"`".DB_PREFIX.DATABASE_VISITOR_DATA_DOMAINS."`.`domain`");
|
|
$this->LoadSearchEngineTable(15,80);
|
|
$this->LoadKnowledgebaseTables();
|
|
|
|
$this->Tops[21]=array();
|
|
$result = DBManager::Execute(true, "SELECT `title`,`description`,`id` AS `gid`,(SELECT SUM(`amount`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_GOALS . "` WHERE" . $this->GetDateMatch() . " AND `goal`=`" . DB_PREFIX . DATABASE_GOALS . "`.`id`) AS `gcount` FROM `" . DB_PREFIX . DATABASE_GOALS . "` ORDER BY `ind` ASC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if($this->VisitorsTotal > 0 && !empty($row["gcount"]))
|
|
{
|
|
$tqueries = array();
|
|
$results = DBManager::Execute(true, "SELECT `t1`.`amount`,`t2`.`query` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_GOALS_QUERIES . "` AS `t1` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_QUERIES . "` AS `t2` ON `t1`.`query`=`t2`.`id` WHERE" . $this->GetDateMatch() . " AND `t1`.`goal`='" . DBManager::RealEscape($row["gid"]) . "' ORDER BY `t1`.`amount` DESC LIMIT " . StatisticProvider::$DayItemAmount . ";");
|
|
while($rows = DBManager::FetchArray($results))
|
|
$tqueries[] = array("qa",$rows["query"],$rows["amount"]);
|
|
$this->Tops[21][$row["gid"]] = array($row["gcount"],Num::Divide((100*$row["gcount"]),$this->VisitorsUnique,StatisticProvider::$RoundPrecision),100-Num::Divide((100*$row["gcount"]),$this->VisitorsUnique,false,true),$row["title"],$row["description"],$tqueries);
|
|
}
|
|
else
|
|
$this->Tops[21][$row["gid"]] = array(0,0,100,$row["title"],$row["description"]);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function GetVisitorsHTML()
|
|
{
|
|
$html_users="";
|
|
$html_user = IOStruct::GetFile(TEMPLATE_HTML_STATS_USERS_USER);
|
|
$html_url = IOStruct::GetFile(TEMPLATE_HTML_STATS_USERS_URL);
|
|
$html_body = IOStruct::GetFile(TEMPLATE_HTML_STATS_USERS_BODY);
|
|
$html_body = str_replace("<!--status-->",($this->Closed) ? "<!--lang_stats_status_closed-->" : "<!--lang_stats_status_open-->",$html_body);
|
|
$vcount = Visitor::Build(true," WHERE `entrance`>='".DBManager::RealEscape($this->Delimiters[0])."' AND `entrance`<='".DBManager::RealEscape($this->Delimiters[1])."'"," LIMIT " . StatisticProvider::$MaxUsersAmount, $this->Delimiters[0]);
|
|
$count = 1;
|
|
foreach(Server::$Visitors as $visitor)
|
|
{
|
|
$user = $html_user;
|
|
$user = str_replace("<!--entrance-->",date("H:i:s",$visitor->FirstActive),$user);
|
|
$user = str_replace("<!--exit-->",date("H:i:s",$visitor->ExitTime),$user);
|
|
$user = str_replace("<!--visits-->",max($visitor->VisitsDay,$visitor->Visits),$user);
|
|
$user = str_replace("<!--visits_day-->",$visitor->VisitsDay,$user);
|
|
$user = str_replace("<!--system-->",((!empty($visitor->OperatingSystem)) ? $visitor->OperatingSystem : "<!--lang_stats_unknown-->"),$user);
|
|
$user = str_replace("<!--browser-->",((!empty($visitor->Browser)) ? $visitor->Browser : "<!--lang_stats_unknown-->"),$user);
|
|
$user = str_replace("<!--country_name-->",((!empty($visitor->GeoCountryName)) ? $visitor->GeoCountryName : "<!--lang_stats_unknown-->"),$user);
|
|
$user = str_replace("<!--city-->",((!empty($visitor->GeoCity)) ? $visitor->GeoCity : "<!--lang_stats_unknown-->"),$user);
|
|
$user = str_replace("<!--region-->",$visitor->GeoRegion,$user);
|
|
$user = str_replace("<!--isp-->",str_replace("'","",$visitor->GeoISP),$user);
|
|
$user = str_replace("<!--ip-->",$visitor->IP,$user);
|
|
$user = str_replace("<!--host-->",str_replace("'","",$visitor->Host),$user);
|
|
$user = str_replace("<!--id-->",$visitor->UserId,$user);
|
|
$user = str_replace("<!--vclass-->",(max($visitor->VisitsDay,$visitor->Visits)==1)?"vn" :(($visitor->VisitsDay>1) ? "vm" : "vs"),$user);$urls="";$id=1;$oid=1;$bcount=1;
|
|
foreach($visitor->Browsers as $browser)
|
|
{
|
|
if($browser->Overlay || empty($browser->History))
|
|
continue;
|
|
|
|
$ucount = 0;
|
|
foreach($browser->History as $hurl)
|
|
{
|
|
if($id == 1 && !Is::Null($hurl->Referrer->GetAbsoluteUrl()) && $hurl->Referrer->GetAbsoluteUrl() != $hurl->Url->GetAbsoluteUrl())
|
|
{
|
|
$url = $html_url;
|
|
$url = str_replace("<!--page-->","Referrer: <a href=\"" . @htmlentities(StatisticProvider::$Dereferrer . $hurl->Referrer->GetAbsoluteUrl(),ENT_QUOTES,'UTF-8')."\" target=\"_blank\"><b>" . @htmlentities($hurl->Referrer->GetAbsoluteUrl(),ENT_QUOTES,'UTF-8') ."</b></a>",$url);
|
|
$url = str_replace("<!--entrance-->"," ",$url);
|
|
$url = str_replace("<!--id-->"," ",$url);
|
|
$url = str_replace("<!--oid-->",$oid++,$url);
|
|
$urls .= $url;
|
|
}
|
|
$urls = str_replace("<!--exit-->",date("H:i:s",$hurl->Entrance),$urls);
|
|
$url = $html_url;
|
|
$url = str_replace("<!--page-->","<!--lang_stats_browser--> ".$bcount.": <a href=\"" . htmlentities(StatisticProvider::$Dereferrer . $hurl->Url->GetAbsoluteUrl(),ENT_QUOTES,'UTF-8')."\" target=\"_blank\"><b>" . @htmlentities($hurl->Url->GetAbsoluteUrl(),ENT_QUOTES,'UTF-8') . "</b></a>",$url);
|
|
$url = str_replace("<!--entrance-->",date("H:i:s",$hurl->Entrance),$url);
|
|
$url = str_replace("<!--id-->",$id++,$url);
|
|
$url = str_replace("<!--oid-->",$oid++,$url);
|
|
$urls .= $url;
|
|
$ucount++;
|
|
}
|
|
|
|
if($ucount>0)
|
|
$bcount++;
|
|
|
|
if($browser->Type == BROWSER_TYPE_CHAT)
|
|
$urls = str_replace("<!--exit-->",date("H:i:s",$browser->LastActive+Server::$Configuration->File["timeout_track"]),$urls);
|
|
else
|
|
$urls = str_replace("<!--exit-->",date("H:i:s",$browser->LastActive),$urls);
|
|
}
|
|
|
|
if($id>1)
|
|
{
|
|
$user = str_replace("<!--pages-->",$id-1,$user);
|
|
$html_users .= $user . str_replace("<!--exit-->",date("H:i:s",$visitor->ExitTime),$urls);
|
|
$html_users = str_replace("<!--number-->",$count++,$html_users);
|
|
}
|
|
}
|
|
$html_body = str_replace("<!--visitors-->",$html_users,$html_body);
|
|
$html_body = str_replace("<!--amount-->",$vcount,$html_body);
|
|
|
|
Server::$Visitors = array();
|
|
Visitor::Build();
|
|
return $html_body;
|
|
}
|
|
|
|
function GetHTML()
|
|
{
|
|
$html = IOStruct::GetFile(TEMPLATE_HTML_STATS_BODY);
|
|
$html = str_replace("<!--quick_value_11-->",number_format($this->VisitorsTotal,0,".","."),$html);
|
|
$html = str_replace("<!--quick_value_17-->",number_format($this->VisitorsUnique,0,".","."),$html);
|
|
$html = str_replace("<!--quick_value_18-->",Num::Divide((100*$this->VisitorsUnique),$this->VisitorsTotal,StatisticProvider::$RoundPrecision),$html);
|
|
$html = str_replace("<!--quick_value_12-->","const",$html);
|
|
$html = str_replace("<!--quick_value_13-->",number_format($this->VisitorsTotal-$this->VisitorsRecurringTotal,0,".","."),$html);
|
|
$html = str_replace("<!--quick_value_14-->",Num::Divide((100*($this->VisitorsTotal-$this->VisitorsRecurringTotal)),$this->VisitorsTotal,StatisticProvider::$RoundPrecision),$html);
|
|
$html = str_replace("<!--quick_value_15-->",number_format($this->VisitorsRecurringTotal,0,".","."),$html);
|
|
$html = str_replace("<!--quick_value_16-->",Num::Divide((100*$this->VisitorsRecurringTotal),$this->VisitorsTotal,StatisticProvider::$RoundPrecision),$html);
|
|
$html = str_replace("<!--quick_value_21-->",Num::Divide((100*$this->VisitorBouncesTotal),$this->VisitorsTotal,StatisticProvider::$RoundPrecision),$html);
|
|
$html = str_replace("<!--quick_value_22-->","const",$html);
|
|
$html = str_replace("<!--quick_value_23-->",number_format($this->VisitorBouncesTotal,0,".","."),$html);
|
|
$html = str_replace("<!--quick_value_31-->",number_format($this->ChatsTotal,0,".","."),$html);
|
|
$html = str_replace("<!--quick_value_32-->","const",$html);
|
|
$html = str_replace("<!--quick_value_33-->",$this->FormatTimespan($this->AVGWaitingTime),$html);
|
|
$html = str_replace("<!--quick_value_41-->",Num::Divide((100*$this->ChatAvailabilityTotal),$this->GetSecondsOfPeriodGroup(null,true),StatisticProvider::$RoundPrecision),$html);
|
|
$html = str_replace("<!--quick_value_42-->","const",$html);
|
|
$html = str_replace("<!--quick_value_43-->",$this->FormatTimespan($this->ChatAvailabilityTotal),$html);
|
|
$html = str_replace("<!--quick_value_44-->",$this->FormatTimespan($this->GetSecondsOfPeriodGroup(null,true)),$html);
|
|
$html = str_replace("<!--quick_value_51-->",Num::Divide((100*$this->ConversionsTotal),$this->VisitorsUnique,StatisticProvider::$RoundPrecision),$html);
|
|
$html = str_replace("<!--quick_value_52-->","const",$html);
|
|
$html = str_replace("<!--quick_value_53-->",number_format($this->ConversionsTotal,0,".","."),$html);
|
|
$html = str_replace("<!--quick_value_tickets-->",number_format($this->TicketsTotal,0,".","."),$html);
|
|
$html = str_replace("<!--quick_value_ticket_response_time-->",$this->FormatTimespan($this->AVGTicketResponseTime),$html);
|
|
$html = str_replace("<!--quick_value_ticket_resolve_time-->",$this->FormatTimespan($this->AVGTicketResolveTime),$html);
|
|
$html = str_replace("<!--status-->",($this->Closed) ? "<!--lang_stats_status_closed-->" : "<!--lang_stats_status_open-->",$html);
|
|
$html = str_replace("<!--stat_type-->",$this->Type,$html);
|
|
$html = str_replace("<--show_links_months-->",($this->Type == STATISTIC_PERIOD_TYPE_YEAR) ? "" : " style=\"display:none;\"",$html);
|
|
$html = str_replace("<--show_links_days-->",($this->Type == STATISTIC_PERIOD_TYPE_MONTH) ? "" : " style=\"display:none;\"",$html);
|
|
$html = str_replace("<!--stats_top_browsers-->",(($this->IncludeTOPSystems) ? $this->RenderTopTable(0,"<!--lang_stats_browsers-->","<!--lang_stats_browser-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_systems-->",(($this->IncludeTOPSystems) ? $this->RenderTopTable(1,"<!--lang_stats_systems-->","<!--lang_stats_system-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_resolutions-->",(($this->IncludeTOPSystems) ? $this->RenderTopTable(5,"<!--lang_stats_resolutions-->","<!--lang_stats_resolution-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_countries-->",(($this->IncludeTOPOrigins) ? $this->RenderTopTable(2,"<!--lang_stats_countries-->","<!--lang_stats_country-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_languages-->",(($this->IncludeTOPOrigins) ? $this->RenderTopTable(6,"<!--lang_stats_languages-->","<!--lang_stats_language-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_regions-->",(($this->IncludeTOPOrigins) ? $this->RenderTopTable(7,"<!--lang_stats_regions-->","<!--lang_stats_region-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_cities-->",(($this->IncludeTOPOrigins) ? $this->RenderTopTable(4,"<!--lang_stats_cities-->","<!--lang_stats_city-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_visits-->",(($this->IncludeTOPVisits) ? $this->RenderTopTable(11,"<!--lang_stats_visits-->","<!--lang_stats_visits-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_isps-->",(($this->IncludeTOPISPs) ? $this->RenderTopTable(12,"<!--lang_stats_isps-->","<!--lang_stats_isp-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_duration-->",(($this->IncludeTOPVisits) ? $this->RenderTopTable(13,"<!--lang_stats_time_on_page-->","<!--lang_stats_duration-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--topvs-->",(($this->IncludeTOPSystems) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topvso-->",(($this->IncludeTOPSystems && $this->IncludeTOPOrigins) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topvo-->",(($this->IncludeTOPOrigins) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topvov-->",(($this->IncludeTOPVisits && ($this->IncludeTOPSystems || $this->IncludeTOPOrigins)) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topvv-->",(($this->IncludeTOPVisits) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topvvi-->",(($this->IncludeTOPISPs && ($this->IncludeTOPSystems || $this->IncludeTOPOrigins || $this->IncludeTOPVisits)) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topvi-->",(($this->IncludeTOPISPs) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topv-->",(($this->IncludeTOPSystems || $this->IncludeTOPOrigins || $this->IncludeTOPVisits || $this->IncludeTOPISPs) ? "" : "none"),$html);
|
|
$html = str_replace("<!--stats_top_queries-->",(($this->IncludeTOPSearch) ? $this->RenderTopTable(3,"<!--lang_stats_search_phrases-->","<!--lang_stats_search_phrase-->") : ""),$html);
|
|
$html = str_replace("<!--stats_top_referrers-->",(($this->IncludeTOPReferrers) ? $this->RenderTopURLTable(30,"<!--lang_stats_referrers-->","<!--lang_stats_referrer-->",true,"URL","Domains")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_pages-->",(($this->IncludeTOPPages) ? $this->RenderTopURLTable(9,"<!--lang_stats_pages-->","<!--lang_stats_page-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_pages_entrance-->",(($this->IncludeTOPEntranceExit) ? $this->RenderTopURLTable(17,"<!--lang_stats_entrance_pages-->","<!--lang_stats_page-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_pages_exit-->",(($this->IncludeTOPEntranceExit) ? $this->RenderTopURLTable(19,"<!--lang_stats_exit_pages-->","<!--lang_stats_page-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_search_engines-->",(($this->IncludeTOPSearch) ? $this->RenderTopTable(15,"<!--lang_stats_search_engines-->","<!--lang_stats_search_engines-->") : ""),$html);
|
|
$html = str_replace("<!--stats_top_domains-->",(($this->IncludeTOPDomains) ? $this->RenderTopTable(14,"<!--lang_stats_domains-->","<!--lang_stats_domain-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_crawlers-->",(($this->IncludeTOPSearch) ? $this->RenderTopTable(16,"<!--lang_stats_crawlers-->","<!--lang_stats_crawler-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_knowledgebase_views-->",(($this->IncludeTOPKnowledgebase) ? $this->RenderTopTable(28,"<!--lang_client_views-->","<!--lang_stats_page-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_knowledgebase_highest_rated-->",(($this->IncludeTOPKnowledgebase) ? $this->RenderTopTable(27,"<!--lang_stats_highest_rated-->","<!--lang_stats_page-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_knowledgebase_lowest_rated-->",(($this->IncludeTOPKnowledgebase) ? $this->RenderTopTable(26,"<!--lang_stats_lowest_rated-->","<!--lang_stats_page-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--stats_top_knowledgebase_queries-->",(($this->IncludeTOPKnowledgebase) ? $this->RenderTopTable(29,"<!--lang_stats_search_phrases-->","<!--lang_stats_search_phrase-->")."<br>" : ""),$html);
|
|
$html = str_replace("<!--toppp-->",(($this->IncludeTOPPages) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topppe-->",(($this->IncludeTOPPages && $this->IncludeTOPEntranceExit) ? "" : "none"),$html);
|
|
$html = str_replace("<!--toppe-->",(($this->IncludeTOPEntranceExit) ? "" : "none"),$html);
|
|
$html = str_replace("<!--toppes-->",(($this->IncludeTOPSearch && ($this->IncludeTOPPages || $this->IncludeTOPEntranceExit)) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topps-->",(($this->IncludeTOPSearch) ? "" : "none"),$html);
|
|
$html = str_replace("<!--toppsr-->",(($this->IncludeTOPReferrers && ($this->IncludeTOPSearch || $this->IncludeTOPEntranceExit || $this->IncludeTOPPages)) ? "" : "none"),$html);
|
|
$html = str_replace("<!--toppr-->",(($this->IncludeTOPReferrers) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topprd-->",(($this->IncludeTOPDomains && ($this->IncludeTOPSearch || $this->IncludeTOPEntranceExit || $this->IncludeTOPPages || $this->IncludeTOPReferrers)) ? "" : "none"),$html);
|
|
$html = str_replace("<!--toppd-->",(($this->IncludeTOPDomains) ? "" : "none"),$html);
|
|
$html = str_replace("<!--topp-->",(($this->IncludeTOPPages || $this->IncludeTOPReferrers || $this->IncludeTOPDomains || $this->IncludeTOPSearch || $this->IncludeTOPEntranceExit) ? "" : "none"),$html);
|
|
$html = str_replace("<!--toppk-->",(($this->IncludeTOPKnowledgebase) ? "" : "none"),$html);
|
|
$html_hours = str_replace("<!--stats_hours_visitors-->",(($this->IncludeBHVisitors) ? $this->GetVisitorsByHour("visitors_unique","<!--lang_stats_visitors-->")."<br>" : ""),IOStruct::GetFile(TEMPLATE_HTML_STATS_HOURS));
|
|
$html_hours = str_replace("<!--stats_hours_impressions-->",(($this->IncludeBHVisitors) ? $this->GetVisitorsByHour("page_impressions","<!--lang_stats_page_impressions-->")."<br>" : ""),$html_hours);
|
|
$html_hours = str_replace("<!--stats_hours_chats-->",(($this->IncludeBHChats) ? $this->GetChatsByHour()."<br>" : ""),$html_hours);
|
|
$html_hours = str_replace("<!--stats_hours_operators-->",(($this->IncludeBHChats) ? $this->GetOperatorsByHour()."<br>" : ""),$html_hours);
|
|
$html = str_replace("<!--hours-->",(($this->IncludeBHVisitors || $this->IncludeBHChats) ? $html_hours : ""),$html);
|
|
$html_operators = str_replace("<!--stats_operator_chats-->",(($this->IncludeBOChats) ? $this->GetChatsByOperator()."<br>" : ""),IOStruct::GetFile(TEMPLATE_HTML_STATS_OPERATORS));
|
|
$html_operators = str_replace("<!--stats_operator_chat_duration-->",(($this->IncludeBOChats) ? $this->GetChatDurationByOperator()."<br>" : ""),$html_operators);
|
|
$html_operators = str_replace("<!--stats_operator_chat_response_times-->",(($this->IncludeBOChats) ? $this->GetChatResponseTimeByOperator()."<br>" : ""),$html_operators);
|
|
$html_operators = str_replace("<!--stats_operator_availability-->",(($this->IncludeBOAvailability) ? $this->GetAvailabilityByOperator()."<br>" : ""),$html_operators);
|
|
$html_operators = str_replace("<!--stats_operator_tickets-->",(($this->IncludeBOTickets) ? $this->GetTicketsByOperator()."<br>" : ""),$html_operators);
|
|
$html_operators = str_replace("<!--stats_operator_ticket_response_times-->",(($this->IncludeBOTickets) ? $this->GetTicketResponseTimesByOperator()."<br>" : ""),$html_operators);
|
|
$html_operators = str_replace("<!--stats_operator_feedbacks-->",(($this->IncludeBOFeedbacks) ? $this->GetFeedbacksByOperator()."<br>" : ""),$html_operators);
|
|
$html_operators = str_replace("<!--stats_operator_invites-->",(($this->IncludeBOInvites) ? $this->GetInvitesByOperator()."<br>" : ""),$html_operators);
|
|
$html_groups = str_replace("<!--stats_group_chats-->",(($this->IncludeBOChats) ? $this->GetChatsByGroup()."<br>" : ""),IOStruct::GetFile(TEMPLATE_HTML_STATS_GROUPS));
|
|
$html_groups = str_replace("<!--stats_group_chat_duration-->",(($this->IncludeBOChats) ? $this->GetChatDurationByGroup()."<br>" : ""),$html_groups);
|
|
$html_groups = str_replace("<!--stats_group_chat_response_times-->",(($this->IncludeBOChats) ? $this->GetChatResponseTimeByGroup()."<br>" : ""),$html_groups);
|
|
$html_groups = str_replace("<!--stats_group_availability-->",(($this->IncludeBOAvailability) ? $this->GetAvailabilityByGroup()."<br>" : ""),$html_groups);
|
|
$html_groups = str_replace("<!--stats_group_tickets-->",(($this->IncludeBOTickets) ? $this->GetTicketsByGroup()."<br>" : ""),$html_groups);
|
|
$html_groups = str_replace("<!--stats_group_ticket_response_times-->",(($this->IncludeBOTickets) ? $this->GetTicketResponseTimesByGroup()."<br>" : ""),$html_groups);
|
|
$html_groups = str_replace("<!--stats_group_feedbacks-->",(($this->IncludeBOFeedbacks) ? $this->GetFeedbacksByGroup()."<br>" : ""),$html_groups);
|
|
$html_groups = str_replace("<!--stats_group_invites-->",(($this->IncludeBOInvites) ? $this->GetInvitesByGroup()."<br>" : ""),$html_groups);
|
|
$html = str_replace("<!--operators-->",(($this->IncludeBOAvailability || $this->IncludeBOChats || $this->IncludeBOInvites || $this->IncludeBOTickets) ? $html_operators : ""),$html);
|
|
$html = str_replace("<!--groups-->",(($this->IncludeBOAvailability || $this->IncludeBOChats || $this->IncludeBOInvites || $this->IncludeBOTickets) ? $html_groups : ""),$html);
|
|
$html = str_replace("<!--bhvcv-->",(($this->IncludeBHChats && $this->IncludeBHVisitors) ? "" : "none"),$html);
|
|
$html = str_replace("<!--bhcv-->",(($this->IncludeBHChats) ? "" : "none"),$html);
|
|
$html = str_replace("<!--boav-->",(($this->IncludeBOAvailability) ? "" : "none"),$html);
|
|
$html = str_replace("<!--bocv-->",(($this->IncludeBOChats) ? "" : "none"),$html);
|
|
$html = str_replace("<!--bofv-->",(($this->IncludeBOFeedbacks) ? "" : "none"),$html);
|
|
$html = str_replace("<!--boti-->",(($this->IncludeBOTickets) ? "" : "none"),$html);
|
|
$html = str_replace("<!--boin-->",(($this->IncludeBOInvites) ? "" : "none"),$html);
|
|
$html = str_replace("<!--bhvv-->",(($this->IncludeBHVisitors) ? "" : "none"),$html);
|
|
$html = str_replace("<!--boavcv-->",(($this->IncludeBOChats && $this->IncludeBOAvailability) ? "" : "none"),$html);
|
|
$html = str_replace("<!--boav-->",(($this->IncludeBOAvailability) ? "" : "none"),$html);
|
|
if($this->Type == STATISTIC_PERIOD_TYPE_MONTH)
|
|
{
|
|
$html_days = str_replace("<!--stats_days_visitors-->",(($this->IncludeBDVisitors) ? $this->GetVisitorsByDays()."<br>" : ""),IOStruct::GetFile(TEMPLATE_HTML_STATS_DAYS));
|
|
$html_days = str_replace("<!--stats_days_impressions-->",(($this->IncludeBDVisitors) ? $this->GetVisitorsByDays(true)."<br>" : ""),$html_days);
|
|
$html_days = str_replace("<!--stats_days_chats-->",(($this->IncludeBDChats) ? $this->GetChatsByDays()."<br>" : ""),$html_days);
|
|
$html_days = str_replace("<!--stats_days_operators-->",(($this->IncludeBDChats) ? $this->GetOperatorsByDays()."<br>" : ""),$html_days);
|
|
$html_days = str_replace("<!--bdvv-->",(($this->IncludeBDVisitors) ? "" : "none"),$html_days);
|
|
$html_days = str_replace("<!--bdvcv-->",(($this->IncludeBDChats && $this->IncludeBDVisitors) ? "" : "none"),$html_days);
|
|
$html_days = str_replace("<!--bdcv-->",(($this->IncludeBDChats) ? "" : "none"),$html_days);
|
|
$html = str_replace("<!--days-->",(($this->IncludeBDVisitors || $this->IncludeBDChats) ? $html_days : ""),$html);
|
|
$html = str_replace("<!--months-->","",$html);
|
|
}
|
|
else if($this->Type == STATISTIC_PERIOD_TYPE_YEAR)
|
|
{
|
|
$html_months = str_replace("<!--stats_months_visitors-->",(($this->IncludeBMVisitors) ? $this->GetVisitorsByMonths()."<br>" : ""),IOStruct::GetFile(TEMPLATE_HTML_STATS_MONTHS));
|
|
$html_months = str_replace("<!--stats_months_impressions-->",(($this->IncludeBMVisitors) ? $this->GetVisitorsByMonths(true)."<br>" : ""),$html_months);
|
|
$html_months = str_replace("<!--stats_months_chats-->",(($this->IncludeBMChats) ? $this->GetChatsByMonths()."<br>" : ""),$html_months);
|
|
$html_months = str_replace("<!--stats_months_operators-->",(($this->IncludeBMChats) ? $this->GetOperatorsByMonths()."<br>" : ""),$html_months);
|
|
$html_months = str_replace("<!--bmvv-->",(($this->IncludeBMVisitors) ? "" : "none"),$html_months);
|
|
$html_months = str_replace("<!--bmvcv-->",(($this->IncludeBMChats && $this->IncludeBMVisitors) ? "" : "none"),$html_months);
|
|
$html_months = str_replace("<!--bmcv-->",(($this->IncludeBMChats) ? "" : "none"),$html_months);
|
|
$html = str_replace("<!--months-->",(($this->IncludeBMVisitors || $this->IncludeBMChats) ? $html_months : ""),$html);
|
|
$html = str_replace("<!--days-->","",$html);
|
|
}
|
|
else
|
|
$html = str_replace("<!--days-->","",$html);
|
|
|
|
$html = str_replace("<!--goals-->",$this->GetGoalTable(),$html);
|
|
$html = str_replace("<!--stats_base_table_general-->",$this->GetBaseTable("<!--lang_stats_visitors-->", array("<!--lang_stats_page_impressions-->"=>array(number_format($this->PageImpressionsTotal,0,".","."),"const"),"<!--lang_stats_pages_per_visitor-->"=>array($this->AVGPagesTotal,"const"),"<!--lang_stats_browser_instances-->"=>array(number_format($this->BrowserInstancesTotal,0,".","."),"const"),"<!--lang_stats_browser_instances_per_visitor-->"=>array($this->AVGBrowserInstances,"const"),"Ø <!--lang_stats_average_time_on_site-->"=>array($this->FormatTimespan($this->AVGTimeOnSiteTotal),"const"),"Ø <!--lang_stats_average_time_on_page-->"=>array($this->FormatTimespan($this->AVGTimeOnPageTotal),"const"))),$html);
|
|
$html = str_replace("<!--stats_base_table_chat-->",$this->GetBaseTable("Chats", array("Chats"=>array(number_format($this->ChatsTotal,0,".","."),"const"),"Chats <!--lang_stats_accepted-->"=>array(number_format($this->ChatsAcceptedTotal,0,".",".") . " (".Num::Divide((100*$this->ChatsAcceptedTotal),$this->ChatsTotal,StatisticProvider::$RoundPrecision)."%)","const"),"Chats <!--lang_stats_declined-->"=>array(number_format($this->ChatsDeclinedTotal,0,".",".") ." (".Num::Divide((100*$this->ChatsDeclinedTotal),$this->ChatsTotal,StatisticProvider::$RoundPrecision)."%)","const"),"Chats <!--lang_stats_missed-->"=>array(number_format($this->ChatsMissedTotal,0,".",".") ." (".Num::Divide((100*$this->ChatsMissedTotal),$this->ChatsTotal,StatisticProvider::$RoundPrecision)."%)","const"),"Ø <!--lang_stats_chat_average_time-->"=>array($this->FormatTimespan($this->AVGTimeInChat),"const"),"Ø <!--lang_stats_chat_average_waiting_time-->"=>array($this->FormatTimespan($this->AVGWaitingTime),"const"))),$html);
|
|
$html = str_replace("<!--stats_base_table_sources-->",$this->GetBaseTable("<!--lang_stats_traffic_sources-->",array("<!--lang_stats_search_engines-->"=>array(number_format($this->FromSearchEngineTotal,0,".",".") . " (" . Num::Divide((100*$this->FromSearchEngineTotal),$this->VisitorsTotal,StatisticProvider::$RoundPrecision)."%)","const"),"<!--lang_stats_referrer-->"=>array(number_format($this->FromReferrerTotal,0,".",".") . " (" . Num::Divide((100*$this->FromReferrerTotal),$this->VisitorsTotal,StatisticProvider::$RoundPrecision)."%)","const"),"<!--lang_stats_direct_access-->"=>array(number_format($this->DirectAccessTotal,0,".",".") . " (" . Num::Divide((100*($this->DirectAccessTotal)),$this->VisitorsTotal,StatisticProvider::$RoundPrecision)."%)","const"))),$html);
|
|
$html = str_replace("<!--stats_base_table_js-->",$this->GetBaseTable("Javascript",array("<!--lang_stats_status_activated-->"=>array(number_format($this->JavascriptTotal,0,".",".") . " (".Num::Divide((100*$this->JavascriptTotal),$this->VisitorsTotal,StatisticProvider::$RoundPrecision)."%)","const"))),$html);
|
|
$html = str_replace("<!--trend-->"," ",$html);
|
|
return $html;
|
|
}
|
|
|
|
function GetReportHTML($_users)
|
|
{
|
|
$html = IOStruct::GetFile($this->GetFilename(true,$_users));
|
|
$html = str_replace("<!--body_part-->",$html,IOStruct::GetFile(TEMPLATE_HTML_STATS_BASE));
|
|
$html = str_replace("<!--server-->",LIVEZILLA_URL,$html);
|
|
return $html;
|
|
}
|
|
|
|
private function GetChatsByOperator($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`amount`) AS `am`,SUM(`accepted`) AS `acc`,SUM(`declined`) AS `dec`,(SELECT SUM(`amount`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `user_id`!='') AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `user_id`!='' GROUP BY `user_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic(true))
|
|
{
|
|
$rows[$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["user_id"]]);
|
|
$details = (isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->IsBot) ? "" : " (" . $row["acc"] . " / " . $row["dec"] . " / " . ($row["am"]-$row["dec"]-$row["acc"]) . ")";
|
|
$rows[$row["user_id"]] = str_replace("<!--abs_amount-->",$row["am"] . $details,$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["user_id"]]);
|
|
$graphData[$this->GetGraphOperatorIndex(Server::$Operators[$row["user_id"]])] = array($row["am"],$row["acc"],$row["dec"],$row["am"]-$row["dec"]-$row["acc"]);
|
|
}
|
|
}
|
|
|
|
foreach(Server::$Operators as $id => $operator)
|
|
if(!isset($rows[$id]) && $operator->AffectsStatistic(true))
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$operator->Fullname,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$this->GetGraphOperatorIndex($operator)] = array(0,0,0,0);
|
|
}
|
|
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_chats"],LocalizationManager::$TranslationStrings["stats_chats"],LocalizationManager::$TranslationStrings["stats_accepted"],LocalizationManager::$TranslationStrings["stats_declined"],LocalizationManager::$TranslationStrings["stats_missed"]),true),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_operator-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_description_operator_chats-->",$html);
|
|
return str_replace("<!--title-->","Chats",$html);
|
|
}
|
|
|
|
private function GetChatsByGroup($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`amount`) AS `am`,SUM(`accepted`) AS `acc`,SUM(`declined`) AS `dec`,(SELECT SUM(`amount`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!= '') AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!= '' GROUP BY `group_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Groups[$row["group_id"]]))
|
|
{
|
|
$rows[$row["group_id"]] = str_replace("<!--title-->",((isset(Server::$Groups[$row["group_id"]]))?Server::$Groups[$row["group_id"]]->Id:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["group_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["group_id"]]);
|
|
$details = " (" . $row["acc"] . " / " . $row["dec"] . " / " . ($row["am"]-$row["dec"]-$row["acc"]) . ")";
|
|
$rows[$row["group_id"]] = str_replace("<!--abs_amount-->",$row["am"] . $details,$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["group_id"]]);
|
|
$graphData[$row["group_id"]] = array($row["am"],$row["acc"],$row["dec"],$row["am"]-$row["dec"]-$row["acc"]);
|
|
}
|
|
}
|
|
foreach(Server::$Groups as $id => $group)
|
|
if(!isset($rows[$id]) && !$group->IsDynamic)
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$group->Id,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$id] = array(0,0,0,0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_chats"],LocalizationManager::$TranslationStrings["stats_chats"],LocalizationManager::$TranslationStrings["stats_accepted"],LocalizationManager::$TranslationStrings["stats_declined"],LocalizationManager::$TranslationStrings["stats_missed"]),true),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_group-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_description_operator_chats-->",$html);
|
|
return str_replace("<!--title-->","Chats",$html);
|
|
}
|
|
|
|
private function GetTicketsByOperator($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`amount`) AS `am`,SUM(`resolves`) AS `res`,SUM(`messages`) AS `mes`,SUM(`responses`) AS `resp`,(SELECT SUM(`amount`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_TICKETS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `user_id` IN ('" . implode("','", array_keys(Server::$Operators)) . "')) AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_TICKETS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic())
|
|
{
|
|
$rows[$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--abs_amount-->",$row["am"] . " (" . $row["res"] . " / " . $row["mes"] . " / " . $row["resp"] . ")",$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["user_id"]]);
|
|
$graphData[$this->GetGraphOperatorIndex(Server::$Operators[$row["user_id"]])] = array($row["am"],$row["res"],$row["mes"],$row["resp"]);
|
|
}
|
|
}
|
|
foreach(Server::$Operators as $id => $user)
|
|
if(!isset($rows[$id]) && $user->AffectsStatistic())
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$user->Fullname,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$this->GetGraphOperatorIndex($user)] = array(0,0,0,0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_operator-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_new_tickets--> (<!--lang_stats_resolved_tickets--> / <!--lang_stats_incoming_messages--> / <!--lang_stats_outgoing_messages-->)",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_tickets"],LocalizationManager::$TranslationStrings["stats_new_tickets"],LocalizationManager::$TranslationStrings["stats_resolved_tickets"],LocalizationManager::$TranslationStrings["stats_incoming_messages"],LocalizationManager::$TranslationStrings["stats_outgoing_messages"]),true),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_tickets-->",$html);
|
|
}
|
|
|
|
private function GetTicketsByGroup($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`amount`) AS `am`,SUM(`resolves`) AS `res`,SUM(`messages`) AS `mes`,SUM(`responses`) AS `resp`,(SELECT SUM(`amount`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_TICKETS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `user_id` IN ('" . implode("','", array_keys(Server::$Groups)) . "')) AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_TICKETS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Groups[$row["user_id"]]))
|
|
{
|
|
$rows[$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Groups[$row["user_id"]]))?Server::$Groups[$row["user_id"]]->Id:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--abs_amount-->",$row["am"] . " (" . $row["res"] . " / " . $row["mes"] . " / " . $row["resp"] . ")",$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["user_id"]]);
|
|
$graphData[$row["user_id"]] = array($row["am"],$row["res"],$row["mes"],$row["resp"]);
|
|
}
|
|
}
|
|
foreach(Server::$Groups as $id => $group)
|
|
if(!isset($rows[$id]) && !$group->IsDynamic)
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$group->Id,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$id] = array(0,0,0,0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_group-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_new_tickets--> (<!--lang_stats_resolved_tickets--> / <!--lang_stats_incoming_messages--> / <!--lang_stats_outgoing_messages-->)",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_tickets"],LocalizationManager::$TranslationStrings["stats_new_tickets"],LocalizationManager::$TranslationStrings["stats_resolved_tickets"],LocalizationManager::$TranslationStrings["stats_incoming_messages"],LocalizationManager::$TranslationStrings["stats_outgoing_messages"]),true),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_tickets-->",$html);
|
|
}
|
|
|
|
private function GetFeedbacksByOperator($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$statTitles = FeedbackCriteria::GetStatArray(true);
|
|
|
|
if(count($statTitles)==0)
|
|
return "<!--no_stat_array-->";
|
|
|
|
$result = DBManager::Execute(true, "SELECT `operator_id`,SUM(`amount`) AS `totalop`,SUM(`ca`) AS `tc0`,SUM(`cb`) AS `tc1`,SUM(`cc`) AS `tc2`,SUM(`cd`) AS `tc3`,(SELECT SUM(`amount`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_FEEDBACKS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `operator_id`!= '') AS `totalall` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_FEEDBACKS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `operator_id`!= '' GROUP BY `operator_id`;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["operator_id"]]))
|
|
{
|
|
$gindex = $this->GetGraphOperatorIndex(Server::$Operators[$row["operator_id"]]);
|
|
$graphData[$gindex] = array();
|
|
foreach($statTitles as $title)
|
|
$graphData[$gindex][] = Num::Divide($row["tc" . count($graphData[$gindex])],$row["totalop"]);
|
|
|
|
$avg = Num::Divide(array_sum($graphData[$gindex]),count($graphData[$gindex]),2);
|
|
$rows[$row["operator_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["operator_id"]]))?Server::$Operators[$row["operator_id"]]->Fullname:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["operator_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["totalop"]),$row["totalall"],StatisticProvider::$RoundPrecision),$rows[$row["operator_id"]]);
|
|
$rows[$row["operator_id"]] = str_replace("<!--abs_amount-->",$row["totalop"] ." (".$avg.")",$rows[$row["operator_id"]]);
|
|
$rows[$row["operator_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["operator_id"]]);
|
|
}
|
|
}
|
|
foreach(Server::$Operators as $id => $operator)
|
|
if(!isset($rows[$id]) && $operator->AffectsStatistic())
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$operator->Fullname,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
|
|
$graphData[$this->GetGraphOperatorIndex($operator)] = array();
|
|
foreach($statTitles as $title)
|
|
$graphData[$this->GetGraphOperatorIndex($operator)][] = 0;
|
|
}
|
|
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$tlist = array(LocalizationManager::$TranslationStrings["stats_stars"]);
|
|
|
|
foreach($statTitles as $title)
|
|
$tlist[] = (isset(LocalizationManager::$TranslationStrings[$title])) ? LocalizationManager::$TranslationStrings[$title] : $title;
|
|
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,$tlist,true),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_operator-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_feedbacks--> (Ø ".LocalizationManager::$TranslationStrings["stats_stars"].")",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_feedbacks-->",$html);
|
|
}
|
|
|
|
private function GetInvitesByOperator($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`invites`) AS `invto`,SUM(`invites_auto`) AS `invau`,SUM(`invites_accepted`) AS `invacc`,SUM(`invites_declined`) AS `invdecc`,(SELECT SUM(`invites`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!= '') AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `user_id`!= '' GROUP BY `user_id` ORDER BY `invto` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]))
|
|
{
|
|
$rows[$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["invto"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["user_id"]]);
|
|
$details = " (" . $row["invdecc"] . " / " . $row["invacc"] . " / " . $row["invau"] . ")";
|
|
$rows[$row["user_id"]] = str_replace("<!--abs_amount-->",$row["invto"] . $details,$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["user_id"]]);
|
|
$graphData[$this->GetGraphOperatorIndex(Server::$Operators[$row["user_id"]])] = array($row["invto"],$row["invdecc"],$row["invacc"],$row["invau"]);
|
|
}
|
|
}
|
|
foreach(Server::$Operators as $id => $user)
|
|
if($user->AffectsStatistic() && !isset($rows[$id]))
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$user->Fullname,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$this->GetGraphOperatorIndex($user)] = array(0,0,0,0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_chat_invites"],LocalizationManager::$TranslationStrings["stats_chat_invites"],LocalizationManager::$TranslationStrings["stats_declined"],LocalizationManager::$TranslationStrings["stats_accepted"],LocalizationManager::$TranslationStrings["stats_auto"]),true),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_operator-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_chat_invites--> (<!--lang_stats_declined--> / <!--lang_stats_accepted--> / <!--lang_stats_auto-->)",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_chat_invites-->",$html);
|
|
}
|
|
|
|
private function GetFeedbacksByGroup($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
|
|
$statTitles = FeedbackCriteria::GetStatArray(true);
|
|
|
|
if(count($statTitles)==0)
|
|
return "";
|
|
|
|
$result = DBManager::Execute(true, "SELECT `group_id`,SUM(`amount`) AS `totalgroup`,SUM(`ca`) AS `tc0`,SUM(`cb`) AS `tc1`,SUM(`cc`) AS `tc2`,SUM(`cd`) AS `tc3`,(SELECT SUM(`amount`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_FEEDBACKS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!= '') AS `totalall` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_FEEDBACKS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!= '' GROUP BY `group_id`;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Groups[$row["group_id"]]))
|
|
{
|
|
$graphData[$row["group_id"]] = array();
|
|
foreach($statTitles as $title)
|
|
if(isset($graphData[$row["group_id"]]) && !empty($row["totalgroup"]))
|
|
$graphData[$row["group_id"]][] = Num::Divide($row["tc" . count($graphData[$row["group_id"]])],$row["totalgroup"]);
|
|
|
|
$avg = Num::Divide(array_sum($graphData[$row["group_id"]]),count($graphData[$row["group_id"]]),2);
|
|
$rows[$row["group_id"]] = str_replace("<!--title-->",((isset(Server::$Groups[$row["group_id"]]))?Server::$Groups[$row["group_id"]]->Id:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["group_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["totalgroup"]),$row["totalall"],StatisticProvider::$RoundPrecision),$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--abs_amount-->",$row["totalgroup"] . " (".$avg.")",$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["group_id"]]);
|
|
}
|
|
}
|
|
foreach(Server::$Groups as $id => $group)
|
|
if(!isset($rows[$id]) && !$group->IsDynamic)
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$group->Id,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$id] = array();
|
|
foreach($statTitles as $title)
|
|
$graphData[$id][] = 0;
|
|
}
|
|
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$tlist = array(LocalizationManager::$TranslationStrings["stats_stars"]);
|
|
foreach($statTitles as $title)
|
|
if(isset(LocalizationManager::$TranslationStrings[$title]))
|
|
$tlist[] = LocalizationManager::$TranslationStrings[$title];
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,$tlist,true),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_group-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_feedbacks--> (Ø ".LocalizationManager::$TranslationStrings["stats_stars"].")",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_feedbacks-->",$html);
|
|
}
|
|
|
|
private function GetInvitesByGroup($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`invites`) AS `invto`,SUM(`invites_auto`) AS `invau`,SUM(`invites_accepted`) AS `invacc`,SUM(`invites_declined`) AS `invdecc`,(SELECT SUM(`invites`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!= '') AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!= '' GROUP BY `group_id` ORDER BY `invto` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Groups[$row["group_id"]]))
|
|
{
|
|
$rows[$row["group_id"]] = str_replace("<!--title-->",((isset(Server::$Groups[$row["group_id"]]))?Server::$Groups[$row["group_id"]]->Id:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["group_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["invto"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["group_id"]]);
|
|
$details = " (" . $row["invdecc"] . " / " . $row["invacc"] . " / " . $row["invau"] . ")";
|
|
$rows[$row["group_id"]] = str_replace("<!--abs_amount-->",$row["invto"] . $details,$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["group_id"]]);
|
|
$graphData[$row["group_id"]] = array($row["invto"],$row["invdecc"],$row["invacc"],$row["invau"]);
|
|
}
|
|
}
|
|
foreach(Server::$Groups as $id => $group)
|
|
if(!isset($rows[$id]) && !$group->IsDynamic)
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$group->Id,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$id] = array(0,0,0,0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_chat_invites"],LocalizationManager::$TranslationStrings["stats_chat_invites"],LocalizationManager::$TranslationStrings["stats_declined"],LocalizationManager::$TranslationStrings["stats_accepted"],LocalizationManager::$TranslationStrings["stats_auto"]),true),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_group-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_chat_invites--> (<!--lang_stats_declined--> / <!--lang_stats_accepted--> / <!--lang_stats_auto-->)",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_chat_invites-->",$html);
|
|
}
|
|
|
|
private function GetChatResponseTimeByOperator($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`chat_posts`) AS `stotal`,(SUM(`avg_response_time`)/COUNT(*)) AS `am`,(SELECT (SUM(`avg_response_time`)/COUNT(*)) as `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `total` DESC LIMIT 1) AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic())
|
|
{
|
|
$rows[$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$row["am"]),$row["total"],false,true),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]) . " (" . $row["stotal"] . ")",$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["user_id"]]);
|
|
$graphData[$this->GetGraphOperatorIndex(Server::$Operators[$row["user_id"]])] = array(round($row["am"],1));
|
|
}
|
|
}
|
|
foreach(Server::$Operators as $id => $user)
|
|
if(!isset($rows[$id]) && $user->AffectsStatistic())
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$user->Fullname,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--rel_floor_amount-->",100,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$this->GetGraphOperatorIndex($user)] = array(0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: Ø <!--lang_stats_chat_response_times--> (hh:mm:ss) / <!--lang_stats_total_messages-->",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_seconds"],LocalizationManager::$TranslationStrings["stats_chat_response_times"])),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_operator-->",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_chat_response_times-->",$html);
|
|
}
|
|
|
|
private function GetChatResponseTimeByGroup($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`chat_posts`) AS `stotal`,(SUM(`avg_response_time`)/COUNT(*)) AS `am`,(SELECT (SUM(`avg_response_time`)/COUNT(*)) as `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id` != '' GROUP BY `group_id` ORDER BY `total` DESC LIMIT 1) AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id` != '' GROUP BY `group_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Groups[$row["group_id"]]))
|
|
{
|
|
$rows[$row["group_id"]] = str_replace("<!--title-->",((isset(Server::$Groups[$row["group_id"]]))?Server::$Groups[$row["group_id"]]->Id:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["group_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]) . " / " . $row["stotal"],$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["group_id"]]);
|
|
$graphData[$row["group_id"]] = array(round($row["am"],1));
|
|
}
|
|
}
|
|
foreach(Server::$Groups as $id => $group)
|
|
if(!isset($rows[$id]) && !$group->IsDynamic)
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$id,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$id] = array(0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: Ø <!--lang_stats_chat_response_times--> (hh:mm:ss) / <!--lang_stats_total_messages-->",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_seconds"],LocalizationManager::$TranslationStrings["stats_chat_response_times"])),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_group-->",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_chat_response_times-->",$html);
|
|
}
|
|
|
|
private function GetTicketResponseTimesByOperator($counter=0,$hrows="")
|
|
{
|
|
$trow = str_replace("%","",IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW));
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`responses`) AS `stotal`,(SUM(`avg_response_time`)/SUM(`responses`)) AS `am`,(SUM(`avg_resolve_time`)/SUM(`resolves`)) AS `res` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_TICKETS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic())
|
|
{
|
|
$rows[$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_amount-->","-",$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_floor_amount-->",100,$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]) . " / " . $this->FormatTimespan($row["res"]),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["user_id"]]);
|
|
$graphData[$this->GetGraphOperatorIndex(Server::$Operators[$row["user_id"]])] = array(round(($row["am"]/3600),1),round(($row["res"]/3600),1));
|
|
}
|
|
}
|
|
foreach(Server::$Operators as $id => $operator)
|
|
if(!isset($rows[$id]) && $operator->AffectsStatistic())
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$operator->Fullname,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--rel_floor_amount-->",100,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$this->GetGraphOperatorIndex($operator)] = array(0,0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: Ø <!--lang_stats_ticket_response_time--> / Ø <!--lang_stats_ticket_resolve_time-->",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_group-->",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_hours"],LocalizationManager::$TranslationStrings["stats_ticket_response_time"],LocalizationManager::$TranslationStrings["stats_ticket_resolve_time"])),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_ticket_response_time-->",$html);
|
|
}
|
|
|
|
private function GetTicketResponseTimesByGroup($counter=0,$hrows="")
|
|
{
|
|
$trow = str_replace("%","",IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW));
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, $d = "SELECT *,SUM(`responses`) AS `stotal`,(SUM(`avg_response_time`)/SUM(`responses`)) AS `am`,(SUM(`avg_resolve_time`)/SUM(`resolves`)) AS `res` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_TICKETS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `am` DESC;");
|
|
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
|
|
if(isset(Server::$Groups[$row["user_id"]]))
|
|
{
|
|
$rows[$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Groups[$row["user_id"]]))?Server::$Groups[$row["user_id"]]->Id:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_amount-->","-",$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]) . " / " . $this->FormatTimespan($row["res"]) . "",$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["user_id"]]);
|
|
$graphData[$row["user_id"]] = array(round(($row["am"]/3600),1),round(($row["res"]/3600),1));
|
|
}
|
|
}
|
|
foreach(Server::$Groups as $id => $group)
|
|
if(!isset($rows[$id]) && !$group->IsDynamic)
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$id,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$id] = array(0,0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: Ø <!--lang_stats_ticket_response_time--> / Ø <!--lang_stats_ticket_resolve_time-->",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_hours"],LocalizationManager::$TranslationStrings["stats_ticket_response_time"],LocalizationManager::$TranslationStrings["stats_ticket_resolve_time"])),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_group-->",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_ticket_response_time-->",$html);
|
|
}
|
|
|
|
private function GetChatDurationByOperator($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,(SUM(`avg_duration`*`amount`)/(SUM(`amount`))) AS `am`,(SUM(`avg_waiting_time`*`amount`)/(SUM(`amount`))) AS `awt`,(SELECT (SUM(`avg_duration`*`amount`)/(SUM(`amount`))) as `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `total` DESC LIMIT 1) AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic())
|
|
{
|
|
$rows[$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$row["am"]),$row["total"],false,true),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]) . " / " . $this->FormatTimespan($row["awt"]),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["user_id"]]);
|
|
$graphData[$this->GetGraphOperatorIndex(Server::$Operators[$row["user_id"]])] = array(round(($row["am"]/60),1),round(($row["awt"]/60),1));
|
|
}
|
|
}
|
|
foreach(Server::$Operators as $id => $operator)
|
|
if(!isset($rows[$id]) && $operator->AffectsStatistic())
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$operator->Fullname,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--rel_floor_amount-->",100,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$this->GetGraphOperatorIndex($operator)] = array(0,0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: Ø <!--lang_stats_chat_average_duration--> (hh:mm:ss) / Ø <!--lang_stats_chat_average_waiting_time--> (hh:mm:ss)",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_minutes"],LocalizationManager::$TranslationStrings["stats_chat_average_duration"],LocalizationManager::$TranslationStrings["stats_chat_average_waiting_time"])),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_operator-->",$html);
|
|
$html = str_replace("<!--title-->","<!--lang_stats_chat_average_duration--> (Ø)",$html);
|
|
|
|
$counter=0;
|
|
$hrows="";
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`avg_duration`*`accepted`) AS `am`,(SELECT SUM(`avg_duration`*`accepted`) as `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `total` DESC LIMIT 1) AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic())
|
|
{
|
|
$rows[$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$row["am"]),$row["total"],false,true),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["user_id"]]);
|
|
$graphData[$this->GetGraphOperatorIndex(Server::$Operators[$row["user_id"]])] = array(round(($row["am"]/60),1));
|
|
}
|
|
}
|
|
foreach(Server::$Operators as $id => $operator)
|
|
if(!isset($rows[$id]) && $operator->AffectsStatistic())
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$operator->Fullname,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--rel_floor_amount-->",100,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$this->GetGraphOperatorIndex($operator)] = array(0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html .= str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_chat_total_duration--> (hh:mm:ss)",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_minutes"],LocalizationManager::$TranslationStrings["stats_chat_total_duration"])),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_operator-->",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_chat_total_duration-->",$html);
|
|
}
|
|
|
|
private function GetChatDurationByGroup($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,(SUM(`avg_duration`*`amount`)/(SUM(`amount`))) AS `am`,(SUM(`avg_waiting_time`*`amount`)/(SUM(`amount`))) AS `awt`,(SELECT (SUM(`avg_duration`*`amount`)/(SUM(`amount`))) as `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!= '' GROUP BY `group_id` ORDER BY `total` DESC LIMIT 1) AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `group_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Groups[$row["group_id"]]))
|
|
{
|
|
$rows[$row["group_id"]] = str_replace("<!--title-->",((isset(Server::$Groups[$row["group_id"]]))?Server::$Groups[$row["group_id"]]->Id:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["group_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]) . " (" . $this->FormatTimespan($row["awt"]) . ")",$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["group_id"]]);
|
|
$graphData[$row["group_id"]] = array(round(($row["am"]/60),1),round(($row["awt"]/60),1));
|
|
}
|
|
}
|
|
foreach(Server::$Groups as $id => $group)
|
|
if(!isset($rows[$id]) && !$group->IsDynamic)
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$group->Id,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$id] = array(0,0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: Ø <!--lang_stats_chat_average_duration--> (hh:mm:ss) / Ø <!--lang_stats_chat_average_waiting_time--> (hh:mm:ss)",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_minutes"],LocalizationManager::$TranslationStrings["stats_chat_average_duration"],LocalizationManager::$TranslationStrings["stats_chat_average_waiting_time"])),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_group-->",$html);
|
|
$html = str_replace("<!--title-->","<!--lang_stats_chat_average_duration--> (Ø)",$html);
|
|
|
|
$counter=0;
|
|
$hrows="";
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, $d = "SELECT *,SUM(`avg_duration`*`accepted`) AS `am`,(SELECT SUM(`avg_duration`*`accepted`) as `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!= '' GROUP BY `group_id` ORDER BY `total` DESC LIMIT 1) AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `group_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Groups[$row["group_id"]]))
|
|
{
|
|
$rows[$row["group_id"]] = str_replace("<!--title-->",((isset(Server::$Groups[$row["group_id"]]))?Server::$Groups[$row["group_id"]]->Id:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["group_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]),$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["group_id"]]);
|
|
$graphData[$row["group_id"]] = array(round(($row["am"]/60),1));
|
|
}
|
|
}
|
|
foreach(Server::$Groups as $id => $group)
|
|
if(!isset($rows[$id]) && !$group->IsDynamic)
|
|
{
|
|
$rows[$id] = str_replace("<!--title-->",$group->Id,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->","-",$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$id] = array(0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html .= str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_chat_total_duration--> (hh:mm:ss)",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_minutes"],LocalizationManager::$TranslationStrings["stats_chat_total_duration"])),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_group-->",$html);
|
|
$html = str_replace("<!--title-->","<!--lang_stats_chat_total_duration-->",$html);
|
|
return $html;
|
|
}
|
|
|
|
private function GetAvailabilityByOperator($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`seconds`) as `am` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_AVAILABILITIES . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic())
|
|
{
|
|
$secondsInPeriod = $this->GetSecondsOfPeriodOperator($row["user_id"]);
|
|
$rows[$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$secondsInPeriod,StatisticProvider::$RoundPrecision),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]),$rows[$row["user_id"]]);
|
|
$rows[$row["user_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["user_id"]]);
|
|
$graphData[$this->GetGraphOperatorIndex(Server::$Operators[$row["user_id"]])] = array(($secondsInPeriod/3600), round(($row["am"]/3600),1));
|
|
}
|
|
}
|
|
foreach(Server::$Operators as $id => $user)
|
|
if(!isset($rows[$id]) && $user->AffectsStatistic())
|
|
{
|
|
$secondsInPeriod = $this->GetSecondsOfPeriodOperator($id);
|
|
$rows[$id] = str_replace("<!--title-->",$user->Fullname,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->",$this->FormatTimespan(0),$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$this->GetGraphOperatorIndex($user)] = array(($secondsInPeriod/3600),0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_hours"],LocalizationManager::$TranslationStrings["stats_target_availability"],LocalizationManager::$TranslationStrings["stats_availability"])),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_availability--> (hh:mm:ss)",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_operator-->",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_operator_availability-->",$html);
|
|
}
|
|
|
|
private function GetAvailabilityByGroup($counter=0,$hrows="")
|
|
{
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$graphData = array();
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`seconds`) as `am` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_AVAILABILITIES . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`!='' GROUP BY `group_id` ORDER BY `am` DESC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if($row["group_id"] != GROUP_EVERYONE_INTERN && !empty($row["group_id"]) && isset(Server::$Groups[$row["group_id"]]))
|
|
{
|
|
$secondsInPeriod = $this->GetSecondsOfPeriodGroup($row["group_id"]);
|
|
$rows[$row["group_id"]] = str_replace("<!--title-->",((isset(Server::$Groups[$row["group_id"]]))?Server::$Groups[$row["group_id"]]->Id:"<!--lang_stats_unknown-->"),$trow);
|
|
$rows[$row["group_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$secondsInPeriod,StatisticProvider::$RoundPrecision),$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]),$rows[$row["group_id"]]);
|
|
$rows[$row["group_id"]] = str_replace("<!--count-->",++$counter,$rows[$row["group_id"]]);
|
|
$graphData[$row["group_id"]] = array(($secondsInPeriod/3600), round(($row["am"]/3600),1));
|
|
}
|
|
}
|
|
foreach(Server::$Groups as $id => $group)
|
|
if(!isset($rows[$id]) && !$group->IsDynamic)
|
|
{
|
|
$secondsInPeriod = $this->GetSecondsOfPeriodGroup($id);
|
|
$rows[$id] = str_replace("<!--title-->",$group->Id,$trow);
|
|
$rows[$id] = str_replace("<!--rel_amount-->",0,$rows[$id]);
|
|
$rows[$id] = str_replace("<!--abs_amount-->",$this->FormatTimespan(0),$rows[$id]);
|
|
$rows[$id] = str_replace("<!--count-->",++$counter,$rows[$id]);
|
|
$graphData[$id] = array(($secondsInPeriod/3600),0);
|
|
}
|
|
foreach($rows as $hrow)
|
|
$hrows .= $hrow;
|
|
|
|
$html = str_replace("<!--rows-->",$hrows,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--graph-->",$this->GetGraphImageTag($graphData,array(LocalizationManager::$TranslationStrings["stats_hours"],LocalizationManager::$TranslationStrings["stats_target_availability"],LocalizationManager::$TranslationStrings["stats_availability"])),$html);
|
|
$html = str_replace("<!--width-->",$this->GetGraphWidth(),$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_group-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_availability--> (hh:mm:ss)",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_group_availability-->",$html);
|
|
}
|
|
|
|
private function GetGoalTable($counter=0,$rows="")
|
|
{
|
|
$html = str_replace("<!--title-->","<!--lang_stats_goals-->",IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$rowt = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rowti = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW_INNER);
|
|
foreach($this->Tops[21] as $id => $values)
|
|
{
|
|
$queries = "";
|
|
if(!empty($values[5]) > 0)
|
|
{
|
|
$qcount=1;
|
|
foreach($values[5] as $qparts)
|
|
{
|
|
if(!empty($qparts[1]))
|
|
{
|
|
$row = str_replace("<!--title-->","<a href=\"http://www.google.com/search?q=".urlencode($qparts[1])."\" target=\"_blank\">".$qparts[1]."</a>",$rowti);
|
|
$row = str_replace("<!--rel_amount-->",Num::Divide((100*$qparts[2]),$values[0],StatisticProvider::$RoundPrecision),$row);
|
|
$row = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$qparts[2]),$values[0],false,true),$row);
|
|
$row = str_replace("<!--abs_amount-->",number_format($qparts[2],0,".","."),$row);
|
|
$queries .= str_replace("<!--count-->",$qcount++,$row);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!empty($queries))
|
|
{
|
|
$queries = str_replace("<!--rows-->",$queries,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE_INNER));
|
|
$queries = str_replace("<!--link_title-->","<!--lang_stats_search_phrases--> (" . ($qcount-1) . ")",$queries);
|
|
$queries = str_replace("<!--expand_all-->","none",$queries);
|
|
$queries = str_replace("<!--column_value_title-->","<!--lang_stats_search_phrases-->",$queries);
|
|
$queries = str_replace("<!--expand_all_block-->",$id,$queries);
|
|
}
|
|
|
|
$counter++;
|
|
$row = str_replace("<!--trend-->","const",str_replace("<!--title-->","<b>".$values[3]."</b><br>".$values[4].$queries,str_replace("<!--value-->",$values[0],$rowt)));
|
|
$row = str_replace("<!--rel_amount-->",$values[1],$row);
|
|
$row = str_replace("<!--rel_floor_amount-->",$values[2],$row);
|
|
$row = str_replace("<!--abs_amount-->",number_format($values[0],0,".","."),$row);
|
|
$rows .= str_replace("<!--count-->",$counter,$row);
|
|
}
|
|
if(count($this->Tops[21])==0)
|
|
{
|
|
$rows .= str_replace("<!--trend-->","const",str_replace("<!--title-->","<!--lang_stats_none-->",str_replace("<!--count-->","",str_replace("<!--abs_amount-->",0,str_replace("<!--rel_floor_amount-->",100,str_replace("<!--rel_amount-->",0,str_replace("<!--value-->","-",$rowt)))))));
|
|
}
|
|
$html = str_replace("<!--trend-->","<!--lang_stats_trend-->",$html);
|
|
$html = str_replace("<!--column_count_width-->","12",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_goals-->",$html);
|
|
return str_replace("<!--rows-->",$rows,$html);
|
|
}
|
|
|
|
function GetBaseTable($_title,$_values,$rows="")
|
|
{
|
|
$table = str_replace("<!--title-->",$_title,IOStruct::GetFile(TEMPLATE_HTML_STATS_BASE_TABLE));
|
|
$row = IOStruct::GetFile(TEMPLATE_HTML_STATS_BASE_ROW);
|
|
foreach($_values as $title => $values)
|
|
$rows .= str_replace("<!--trend_value-->",$values[1],str_replace("<!--title-->",$title,str_replace("<!--value-->",$values[0],$row)));
|
|
return str_replace("<!--rows-->",$rows,$table);
|
|
}
|
|
|
|
function GetSecondsOfPeriodGroup($_group,$_all=false)
|
|
{
|
|
$seconds = 0;
|
|
if(isset(Server::$Groups[$_group]))
|
|
{
|
|
if(count(Server::$Groups[$_group]->OpeningHours) > 0)
|
|
{
|
|
foreach(Server::$Groups[$_group]->OpeningHours as $hour)
|
|
{
|
|
if($this->Type == STATISTIC_PERIOD_TYPE_DAY)
|
|
{
|
|
if($hour[0] == date("N"))
|
|
$seconds += ($hour[2] - $hour[1]);
|
|
}
|
|
else
|
|
{
|
|
$st = $this->StartTime;
|
|
while($st < $this->EndTime)
|
|
{
|
|
if($hour[0] == date("N",$st))
|
|
$seconds += ($hour[2] - $hour[1]);
|
|
$st+=86400;
|
|
}
|
|
}
|
|
}
|
|
return $seconds;
|
|
}
|
|
}
|
|
else if($_all)
|
|
{
|
|
Server::InitDataBlock(array("GROUPS"));
|
|
foreach(Server::$Groups as $gid => $group)
|
|
$seconds = max($seconds,$this->GetSecondsOfPeriodGroup($gid));
|
|
return $seconds;
|
|
}
|
|
return 3600 * StatisticProvider::$OpeningHours * $this->DayCount;
|
|
}
|
|
|
|
function GetSecondsOfPeriodOperator($_operator)
|
|
{
|
|
$seconds = 0;
|
|
if(isset(Server::$Operators[$_operator]))
|
|
{
|
|
foreach(Server::$Operators[$_operator]->Groups as $groupid)
|
|
$seconds = max($this->GetSecondsOfPeriodGroup($groupid),$seconds);
|
|
|
|
if($seconds > 0)
|
|
return $seconds;
|
|
}
|
|
return 3600 * StatisticProvider::$OpeningHours * $this->DayCount;
|
|
}
|
|
|
|
function GetVisitorsByMonths($_impressions=false,$html = "")
|
|
{
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_SPAN_ROW);
|
|
$total = 0;
|
|
|
|
foreach($this->Months as $month)
|
|
$total = max($total,($_impressions) ? $month->PageImpressionsTotal : $month->VisitorsTotal);
|
|
foreach($this->Months as $month)
|
|
{
|
|
$value = ($_impressions) ? $month->PageImpressionsTotal : $month->VisitorsTotal;
|
|
$html .= str_replace("<!--title-->","<!--lang_stats_month_" . strtolower(date("F",mktime(0,0,0,$month->Month,1,$month->Year))) . "-->",$hrow);
|
|
if($total > 0)
|
|
$html = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$value),$total,false,true),$html);
|
|
else
|
|
$html = str_replace("<!--rel_floor_amount-->",100,$html);
|
|
$html = str_replace("<!--abs_amount-->",number_format($value,0,".","."),$html);
|
|
$html = str_replace("<!--count-->",date("m",mktime(0,0,0,$month->Month,1,$month->Year))."/".$month->Year,$html);
|
|
}
|
|
$html = str_replace("<!--rows-->",$html,IOStruct::GetFile(TEMPLATE_HTML_STATS_SPAN_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","70",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_by_days-->",$html);
|
|
return str_replace("<!--title-->",($_impressions) ? "<!--lang_stats_page_impressions-->" : "<!--lang_stats_visitors-->",$html);
|
|
}
|
|
|
|
function GetOperatorsByMonths($counter=0,$html = "",$crow="")
|
|
{
|
|
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_HOURS_HIDDEN_ROW);
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
|
|
foreach($this->Months as $month)
|
|
$months[intval($month->Month)] = 0;
|
|
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`seconds`) as `am` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_AVAILABILITIES . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id`,`year`,`month` ORDER BY `user_id`,`year`,`month` ASC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
$secondsInPeriod = 3600 * 24 * $this->Months[$month->Month]->DayCount;
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic())
|
|
{
|
|
if(!isset($count[$row["month"]]))
|
|
$count[$row["month"]] = 0;
|
|
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$hrow);
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$secondsInPeriod,StatisticProvider::$RoundPrecision),$rows[$row["month"]][$row["user_id"]]);
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$row["am"]),$secondsInPeriod,false,true),$rows[$row["month"]][$row["user_id"]]);
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]),$rows[$row["month"]][$row["user_id"]]);
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--count-->",++$count[$row["month"]],$rows[$row["month"]][$row["user_id"]]);
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--id-->","ma_".$row["month"]."<!--number-->",$rows[$row["month"]][$row["user_id"]]);
|
|
}
|
|
else
|
|
$months[$row["month"]] += $row["am"];
|
|
}
|
|
|
|
foreach($this->Months as $month)
|
|
{
|
|
$secondsInPeriod = 3600 * 24 * $this->Months[$month->Month]->DayCount;
|
|
$monthnumb = intval($month->Month);
|
|
$counter=1;
|
|
$orows = "";
|
|
if(isset($rows[$monthnumb]))
|
|
{
|
|
$crow .= str_replace("<!--title-->","<a href=\"javascript:switchRowVisibility('ma_".$monthnumb."');\"><!--lang_stats_month_" . strtolower(date("F",mktime(0,0,0,$month->Month,1,$month->Year))) . "--></a>",$trow);
|
|
foreach($rows[$monthnumb] as $row)
|
|
$orows .= str_replace("<!--number-->",$counter++,$row);
|
|
}
|
|
else
|
|
$crow .= str_replace("<!--title-->","<!--lang_stats_month_" . strtolower(date("F",mktime(0,0,0,$month->Month,1,$month->Year))) . "-->",$trow);
|
|
|
|
$crow = str_replace("<!--rel_amount-->",Num::Divide((100*$months[$monthnumb]),$secondsInPeriod,StatisticProvider::$RoundPrecision),$crow);
|
|
$crow = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$months[$monthnumb]),$secondsInPeriod,false,true),$crow);
|
|
$crow = str_replace("<!--abs_amount-->",$this->FormatTimespan($months[$monthnumb]),$crow);
|
|
$crow = str_replace("<!--count-->",date("m",mktime(0,0,0,$month->Month,1,$month->Year))."/".$month->Year,$crow);
|
|
$crow .= $orows;
|
|
}
|
|
$html = str_replace("<!--rows-->",$crow,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","70",$html);
|
|
$html = str_replace("<!--expand_all-->","",$html);
|
|
$html = str_replace("<!--expand_all_block-->","ma",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_hour-->",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_operator_availability-->",$html);
|
|
}
|
|
|
|
function GetChatsByMonths($crow="",$max = 0)
|
|
{
|
|
$rows = array();
|
|
foreach($this->Months as $month)
|
|
$months[intval($month->Month)] = array(0,0,0);
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_HOURS_HIDDEN_ROW);
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`amount`) AS `amount`,SUM(`accepted`) AS `acc`,SUM(`declined`) AS `dec`,(SELECT SUM(`amount`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`='') AS total,(SELECT `amount` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id` = '' ORDER BY `amount` DESC LIMIT 1) AS `mamount` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id` = '' GROUP BY `user_id`,`year`,`month` ORDER BY `user_id`,`year`,`month` ASC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]))
|
|
{
|
|
if(!isset($count[$row["month"]]))
|
|
$count[$row["month"]] = 0;
|
|
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$hrow);
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["amount"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["month"]][$row["user_id"]]);
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$row["amount"]),$row["total"],false,true),$rows[$row["month"]][$row["user_id"]]);
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--abs_amount-->",$row["amount"] . " (" . $row["acc"] . " / " . $row["dec"] . " / " .($row["amount"]-$row["dec"]-$row["acc"]) . ")",$rows[$row["month"]][$row["user_id"]]);
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--count-->",++$count[$row["month"]],$rows[$row["month"]][$row["user_id"]]);
|
|
$rows[$row["month"]][$row["user_id"]] = str_replace("<!--id-->","cbd_".$row["month"]."<!--number-->",$rows[$row["month"]][$row["user_id"]]);
|
|
}
|
|
$months[$row["month"]][0]+= $row["amount"];
|
|
$months[$row["month"]][1]+= $row["dec"];
|
|
$months[$row["month"]][2]+= $row["acc"];
|
|
$max = $row["total"];
|
|
}
|
|
|
|
foreach($this->Months as $month)
|
|
{
|
|
$int = intval($month->Month);
|
|
$counter=1;
|
|
$orows = "";
|
|
if(isset($rows[$int]))
|
|
{
|
|
$crow .= str_replace("<!--title-->","<a href=\"javascript:switchRowVisibility('cbd_".$int."');\"><!--lang_stats_month_" . strtolower(date("F",mktime(0,0,0,$month->Month,1,$month->Year))) . "--></a>",$trow);
|
|
foreach($rows[$int] as $row)
|
|
$orows .= str_replace("<!--number-->",$counter++,$row);
|
|
}
|
|
else
|
|
$crow .= str_replace("<!--title-->","<!--lang_stats_month_" . strtolower(date("F",mktime(0,0,0,$month->Month,1,$month->Year))) . "-->",$trow);
|
|
|
|
$crow = str_replace("<!--rel_amount-->",Num::Divide((100*$months[$int][0]),$max,StatisticProvider::$RoundPrecision),$crow);
|
|
$crow = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$months[$int][0]),$max,false,true),$crow);
|
|
$crow = str_replace("<!--abs_amount-->",$months[$int][0] . " (" .$months[$int][2]." / " . $months[$int][1]. " / " . ($months[$int][0]-$months[$int][1]-$months[$int][2]) . ")",$crow);
|
|
$crow = str_replace("<!--count-->",date("m",mktime(0,0,0,$month->Month,1,$month->Year))."/".$month->Year,$crow);
|
|
$crow .= $orows;
|
|
}
|
|
$html = str_replace("<!--rows-->",$crow,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","70",$html);
|
|
$html = str_replace("<!--expand_all-->","",$html);
|
|
$html = str_replace("<!--expand_all_block-->","cbd",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_hour-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_description_operator_chats-->",$html);
|
|
return str_replace("<!--title-->","Chats",$html);
|
|
}
|
|
|
|
function GetVisitorsByDays($_impressions=false,$html = "")
|
|
{
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_SPAN_ROW);
|
|
$total = 0;
|
|
foreach($this->Days as $day)
|
|
$total = max($total,($_impressions) ? $day->PageImpressionsTotal : $day->VisitorsTotal);
|
|
foreach($this->Days as $day)
|
|
{
|
|
$value = ($_impressions) ? $day->PageImpressionsTotal : $day->VisitorsTotal;
|
|
$html .= str_replace("<!--title-->"," ",$hrow);
|
|
if($total > 0)
|
|
{
|
|
$html = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$value),$total,false,true),$html);
|
|
}
|
|
else
|
|
{
|
|
$html = str_replace("<!--rel_floor_amount-->",100,$html);
|
|
}
|
|
$html = str_replace("<!--abs_amount-->",number_format($value,0,".","."),$html);
|
|
$html = str_replace("<!--count-->",StatisticProvider::GetDynamicDateFrame(mktime(0,0,0,$day->Month,$day->Day,$day->Year)),$html);
|
|
}
|
|
$html = str_replace("<!--rows-->",$html,IOStruct::GetFile(TEMPLATE_HTML_STATS_SPAN_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","70",$html);
|
|
$html = str_replace("<!--column_value_title-->"," ",$html);
|
|
return str_replace("<!--title-->",($_impressions) ? "<!--lang_stats_page_impressions-->" : "<!--lang_stats_visitors-->",$html);
|
|
}
|
|
|
|
function GetOperatorsByDays($counter=0,$html = "",$crow = "")
|
|
{
|
|
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_HOURS_HIDDEN_ROW);
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
|
|
foreach($this->Days as $day)
|
|
$days[intval($day->Day)] = 0;
|
|
|
|
$secondsInPeriod = 3600 * 24;
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`seconds`) as `am` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_AVAILABILITIES . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id`='' GROUP BY `user_id`,`year`,`month`,`day` ORDER BY `user_id`,`day` ASC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic())
|
|
{
|
|
if(!isset($count[$row["day"]]))
|
|
$count[$row["day"]] = 0;
|
|
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$hrow);
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$secondsInPeriod,StatisticProvider::$RoundPrecision),$rows[$row["day"]][$row["user_id"]]);
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$row["am"]),$secondsInPeriod,false,true),$rows[$row["day"]][$row["user_id"]]);
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--abs_amount-->",$this->FormatTimespan($row["am"]),$rows[$row["day"]][$row["user_id"]]);
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--count-->",++$count[$row["day"]],$rows[$row["day"]][$row["user_id"]]);
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--id-->","da_".$row["day"]."<!--number-->",$rows[$row["day"]][$row["user_id"]]);
|
|
}
|
|
else
|
|
$days[$row["day"]] += $row["am"];
|
|
}
|
|
|
|
foreach($this->Days as $day)
|
|
{
|
|
$daynumb = intval($day->Day);
|
|
$counter=1;
|
|
$orows = "";
|
|
if(isset($rows[$daynumb]))
|
|
{
|
|
$crow .= str_replace("<!--title-->","<a href=\"javascript:switchRowVisibility('da_".$daynumb."');\">" . StatisticProvider::GetDynamicDateFrame(mktime(0,0,0,$day->Month,$day->Day,$day->Year)) . "</a>",$trow);
|
|
foreach($rows[$daynumb] as $row)
|
|
$orows .= str_replace("<!--number-->",$counter++,$row);
|
|
}
|
|
else
|
|
$crow .= str_replace("<!--title-->",StatisticProvider::GetDynamicDateFrame(mktime(0,0,0,$day->Month,$day->Day,$day->Year)),$trow);
|
|
|
|
$crow = str_replace("<!--rel_amount-->",Num::Divide((100*$days[$daynumb]),$secondsInPeriod,StatisticProvider::$RoundPrecision),$crow);
|
|
$crow = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$days[$daynumb]),$secondsInPeriod,false,true),$crow);
|
|
$crow = str_replace("<!--abs_amount-->",$this->FormatTimespan($days[$daynumb]),$crow);
|
|
$crow = str_replace("<!--count-->"," ",$crow);
|
|
$crow .= $orows;
|
|
}
|
|
$html = str_replace("<!--rows-->",$crow,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","25",$html);
|
|
$html = str_replace("<!--expand_all-->","",$html);
|
|
$html = str_replace("<!--expand_all_block-->","da",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_by_days-->",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_operator_availability-->",$html);
|
|
}
|
|
|
|
function GetChatsByDays($counter=0,$html="",$crow="",$max=0)
|
|
{
|
|
$rows = array();
|
|
foreach($this->Days as $day)
|
|
$days[intval($day->Day)] = array(0,0,0);
|
|
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_HOURS_HIDDEN_ROW);
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`amount`) AS `am`,SUM(`accepted`) AS `acc`,SUM(`declined`) AS `dec`,(SELECT SUM(`amount`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id` = '') AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND group_id = '' GROUP BY `user_id`,`year`,`month`,`day` ORDER BY `user_id`,`day` ASC;");
|
|
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(isset(Server::$Operators[$row["user_id"]]))
|
|
{
|
|
if(!isset($count[$row["day"]]))
|
|
$count[$row["day"]] = 0;
|
|
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?Server::$Operators[$row["user_id"]]->Fullname:"<!--lang_stats_unknown-->"),$hrow);
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--rel_amount-->",Num::Divide((100*$row["am"]),$row["total"],StatisticProvider::$RoundPrecision),$rows[$row["day"]][$row["user_id"]]);
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$row["am"]),$row["total"],false,true),$rows[$row["day"]][$row["user_id"]]);
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--abs_amount-->",$row["am"] . " (" . $row["acc"] . " / " . $row["dec"] . " / " .($row["am"]-$row["dec"]-$row["acc"]) . ")",$rows[$row["day"]][$row["user_id"]]);
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--count-->",++$count[$row["day"]],$rows[$row["day"]][$row["user_id"]]);
|
|
$rows[$row["day"]][$row["user_id"]] = str_replace("<!--id-->","cbd_".$row["day"]."<!--number-->",$rows[$row["day"]][$row["user_id"]]);
|
|
}
|
|
|
|
$days[$row["day"]][0] += $row["am"];
|
|
$days[$row["day"]][1] += $row["dec"];
|
|
$days[$row["day"]][2] += $row["acc"];
|
|
$max = $row["total"];
|
|
}
|
|
|
|
foreach($this->Days as $day)
|
|
{
|
|
$int = intval($day->Day);
|
|
$counter=1;
|
|
$orows = "";
|
|
if(isset($rows[$int]))
|
|
{
|
|
$crow .= str_replace("<!--title-->","<a href=\"javascript:switchRowVisibility('cbd_".$int."');\">".StatisticProvider::GetDynamicDateFrame(mktime(0,0,0,$day->Month,$day->Day,$day->Year)) . "</a>",$trow);
|
|
foreach($rows[$int] as $row)
|
|
$orows .= str_replace("<!--number-->",$counter++,$row);
|
|
}
|
|
else
|
|
$crow .= str_replace("<!--title-->",StatisticProvider::GetDynamicDateFrame(mktime(0,0,0,$day->Month,$day->Day,$day->Year)),$trow);
|
|
|
|
$crow = str_replace("<!--rel_amount-->",Num::Divide((100*$days[$int][0]),$max,StatisticProvider::$RoundPrecision),$crow);
|
|
$crow = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$days[$int][0]),$max,false,true),$crow);
|
|
$crow = str_replace("<!--abs_amount-->",$days[$int][0] . " (" . $days[$int][2] . " / " . $days[$int][1] . " / " .($days[$int][0]-$days[$int][2]-$days[$int][1]) . ")",$crow);
|
|
$crow = str_replace("<!--count-->"," ",$crow);
|
|
$crow .= $orows;
|
|
}
|
|
$html = str_replace("<!--rows-->",$crow,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","25",$html);
|
|
$html = str_replace("<!--expand_all-->","",$html);
|
|
$html = str_replace("<!--expand_all_block-->","cbd",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_by_days-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_description_operator_chats-->",$html);
|
|
return str_replace("<!--title-->","Chats",$html);
|
|
}
|
|
|
|
function GetVisitorsByHour($_field,$_title,$counter=0,$crow = "",$total=0)
|
|
{
|
|
$hours = array(0=>0,1=>0,2=>0,3=>0,4=>0,5=>0,6=>0,7=>0,8=>0,9=>0,10=>0,11=>0,12=>0,13=>0,14=>0,15=>0,16=>0,17=>0,18=>0,19=>0,20=>0,21=>0,22=>0,23=>0);
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_SPAN_ROW);
|
|
$result = DBManager::Execute(true, "SELECT *,(SELECT SUM(`" . $_field . "`) AS `maxval` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_VISITORS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `hour` ORDER BY `maxval` DESC LIMIT 1) as `mtotal` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_VISITORS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " ORDER BY `hour` ASC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
$hours[$row["hour"]] += $row[$_field];
|
|
$total = max($total,$row["mtotal"]);
|
|
}
|
|
foreach($hours as $hour => $amount)
|
|
{
|
|
$crow .= str_replace("<!--title-->",date("H:i",mktime($hour,0,0)),$hrow);
|
|
if($total > 0)
|
|
$crow = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$amount),$total,false,true),$crow);
|
|
else
|
|
$crow = str_replace("<!--rel_floor_amount-->",100,$crow);
|
|
$crow = str_replace("<!--abs_amount-->",number_format($amount,0,".","."),$crow);
|
|
$crow = str_replace("<!--count-->"," ",$crow);
|
|
}
|
|
$html = str_replace("<!--rows-->",$crow,IOStruct::GetFile(TEMPLATE_HTML_STATS_SPAN_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","25",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_hour-->",$html);
|
|
return str_replace("<!--title-->",$_title,$html);
|
|
}
|
|
|
|
function GetChatsByHour($crow = "",$max=0)
|
|
{
|
|
$rows = array();
|
|
$hours = array(array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0),array(0,0,0));
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_HOURS_HIDDEN_ROW);
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$result = DBManager::Execute(true, "SELECT *,(SELECT SUM(`amount`) FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id` = '') AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_CHATS . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `group_id` = '' ORDER BY `user_id`,`hour` ASC;");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(!isset($hours[$row["hour"]][$row["user_id"]]))
|
|
$hours[$row["hour"]][$row["user_id"]] = array(0,0,0);
|
|
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic(true))
|
|
{
|
|
if(!isset($hours[$row["hour"]][$row["user_id"]]))
|
|
$hours[$row["hour"]][$row["user_id"]] = array(0,0,0);
|
|
|
|
$hours[$row["hour"]][$row["user_id"]][0]+= $row["amount"];
|
|
$hours[$row["hour"]][$row["user_id"]][1]+= $row["declined"];
|
|
$hours[$row["hour"]][$row["user_id"]][2]+= $row["accepted"];
|
|
}
|
|
|
|
if(!isset($hours[$row["hour"]]["total"]))
|
|
$hours[$row["hour"]]["total"] = array(0,0,0);
|
|
|
|
$hours[$row["hour"]]["total"][0]+= $row["amount"];
|
|
$hours[$row["hour"]]["total"][1]+= $row["declined"];
|
|
$hours[$row["hour"]]["total"][2]+= $row["accepted"];
|
|
$max = $row["total"];
|
|
}
|
|
|
|
foreach($hours as $hour => $objar)
|
|
foreach($objar as $uid => $values)
|
|
{
|
|
if($uid == "total" || !isset(Server::$Operators[$uid]))
|
|
continue;
|
|
|
|
$rows[$hour][$uid] = str_replace("<!--title-->",Server::$Operators[$uid]->Fullname,$hrow);
|
|
$rows[$hour][$uid] = str_replace("<!--rel_amount-->",Num::Divide((100*$values[0]),$max,StatisticProvider::$RoundPrecision),$rows[$hour][$uid]);
|
|
$rows[$hour][$uid] = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$values[0]),$max,false,true),$rows[$hour][$uid]);
|
|
$rows[$hour][$uid] = str_replace("<!--abs_amount-->",$values[0] . " (" . $values[2] . " / " . $values[1] . " / " .($values[0]-$values[1]-$values[2]) . ")",$rows[$hour][$uid]);
|
|
$rows[$hour][$uid] = str_replace("<!--id-->","cbh_".$hour."<!--number-->",$rows[$hour][$uid]);
|
|
}
|
|
|
|
for($int=0;$int<24;$int++)
|
|
{
|
|
$counter=1;
|
|
$orows = "";
|
|
if(isset($rows[$int]))
|
|
{
|
|
$crow .= str_replace("<!--title-->","<a href=\"javascript:switchRowVisibility('cbh_".$int."');\">".date("H:i",mktime($int,0,0))."</a>",$trow);
|
|
foreach($rows[$int] as $row)
|
|
{
|
|
$orows .= str_replace("<!--number-->",$counter,$row);
|
|
$orows = str_replace("<!--count-->",$counter++,$orows);
|
|
}
|
|
}
|
|
else
|
|
$crow .= str_replace("<!--title-->",date("H:i",mktime($int,0,0)),$trow);
|
|
|
|
if(!isset($hours[$int]["total"]))
|
|
$hours[$int]["total"] = array(0,0,0);
|
|
|
|
$crow = str_replace("<!--rel_amount-->",($max>0) ? Num::Divide((100*$hours[$int]["total"][0]),$max,StatisticProvider::$RoundPrecision) : "0",$crow);
|
|
$crow = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$hours[$int]["total"][0]),$max,false,true),$crow);
|
|
$crow = str_replace("<!--abs_amount-->",$hours[$int]["total"][0] . " (" . $hours[$int]["total"][2] . " / " . $hours[$int]["total"][1] . " / " .($hours[$int]["total"][0]-$hours[$int]["total"][2]-$hours[$int]["total"][1]) . ")",$crow);
|
|
$crow = str_replace("<!--count-->"," ",$crow);
|
|
$crow .= $orows;
|
|
}
|
|
$html = str_replace("<!--rows-->",$crow,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","25",$html);
|
|
$html = str_replace("<!--expand_all-->","",$html);
|
|
$html = str_replace("<!--expand_all_block-->","cbh",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_hour-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_description_operator_chats-->",$html);
|
|
return str_replace("<!--title-->","Chats",$html);
|
|
}
|
|
|
|
function GetOperatorsByHour($crow = "")
|
|
{
|
|
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_HOURS_HIDDEN_ROW);
|
|
$trow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$rows = array();
|
|
$hours = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
|
|
$ontime = array();
|
|
$secondsInPeriod = 3600 * $this->DayCount;
|
|
|
|
$result = DBManager::Execute(true, "SELECT * FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_AVAILABILITIES . "` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `user_id`,`day`,`hour`,`status` ORDER BY `user_id` ASC,`hour` ASC,`status` ASC;");
|
|
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
$row["seconds"] = min($row["seconds"],3600);
|
|
|
|
if(isset(Server::$Operators[$row["user_id"]]) && Server::$Operators[$row["user_id"]]->AffectsStatistic())
|
|
{
|
|
$rows[$row["hour"]][$row["user_id"]] = str_replace("<!--title-->",((isset(Server::$Operators[$row["user_id"]]))?(Server::$Operators[$row["user_id"]]->Fullname):"<!--lang_stats_unknown-->"),$hrow);
|
|
$rows[$row["hour"]][$row["user_id"]] = str_replace("<!--id-->","oa_".$row["hour"]."<!--number-->",$rows[$row["hour"]][$row["user_id"]]);
|
|
|
|
if(!isset($ontime[$row["user_id"]][$row["hour"]]))
|
|
$ontime[$row["user_id"]][$row["hour"]] = array(USER_STATUS_BUSY=>0,USER_STATUS_ONLINE=>0);
|
|
|
|
$ontime[$row["user_id"]][$row["hour"]][$row["status"]] += $row["seconds"];
|
|
}
|
|
else if($row["user_id"]=="everyoneintern")
|
|
$hours[$row["hour"]] += $row["seconds"];
|
|
}
|
|
|
|
for($int=0;$int<24;$int++)
|
|
{
|
|
$counter=1;
|
|
$orows = "";
|
|
$count[$int] = 1;
|
|
|
|
if(isset($rows[$int]))
|
|
{
|
|
$crow .= str_replace("<!--title-->","<a href=\"javascript:switchRowVisibility('oa_".$int."');\">".date("H:i",mktime($int,0,0))."</a>",$trow);
|
|
foreach($rows[$int] as $sysid => $row)
|
|
{
|
|
$secval = $ontime[$sysid][$int][USER_STATUS_ONLINE];
|
|
$busystr = $this->FormatTimespan($ontime[$sysid][$int][USER_STATUS_BUSY]);
|
|
$totalval = $secval + $ontime[$sysid][$int][USER_STATUS_BUSY];
|
|
|
|
$row = str_replace("<!--rel_amount-->",Num::Divide((100*$totalval),$secondsInPeriod,StatisticProvider::$RoundPrecision),$row);
|
|
$row = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$totalval),$secondsInPeriod,false,true),$row);
|
|
$row = str_replace("<!--abs_amount-->",$this->FormatTimespan($secval)." (" . $busystr . ")",$row);
|
|
|
|
$row = str_replace("<!--count-->",$count[$int]++,$row);
|
|
$orows .= str_replace("<!--number-->",$counter++,$row);
|
|
}
|
|
}
|
|
else
|
|
$crow .= str_replace("<!--title-->",date("H:i",mktime($int,0,0)),$trow);
|
|
|
|
$crow = str_replace("<!--rel_amount-->",Num::Divide((100*$hours[$int]),$secondsInPeriod,StatisticProvider::$RoundPrecision),$crow);
|
|
$crow = str_replace("<!--rel_floor_amount-->",100-Num::Divide((100*$hours[$int]),$secondsInPeriod,false,true),$crow);
|
|
$crow = str_replace("<!--abs_amount-->",$this->FormatTimespan($hours[$int]),$crow);
|
|
$crow = str_replace("<!--count-->"," ",$crow);
|
|
$crow .= $orows;
|
|
}
|
|
$html = str_replace("<!--rows-->",$crow,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","25",$html);
|
|
$html = str_replace("<!--expand_all-->","",$html);
|
|
$html = str_replace("<!--expand_all_block-->","oa",$html);
|
|
$html = str_replace("<!--column_value_title-->","<!--lang_stats_hour-->",$html);
|
|
$html = str_replace("<!--description-->","<!--lang_stats_absolute-->: <!--lang_stats_status_online--> (<!--lang_stats_status_busy-->)",$html);
|
|
return str_replace("<!--title-->","<!--lang_stats_operator_availability-->",$html);
|
|
}
|
|
|
|
function LoadURLTable($_table,$_id,$_maxlength,$_title,$_max,$counter=0)
|
|
{
|
|
$result = DBManager::Execute(true, "SELECT `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`domain` as did,`" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`path` as pid,`" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`domain`,`" . DB_PREFIX . DATABASE_VISITOR_DATA_PATHS . "`.`path`,`amount` as abs FROM `" . DB_PREFIX . $_table . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` ON `" . DB_PREFIX . $_table . "`.`url` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` ON `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`domain` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PATHS . "` ON `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`path` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_PATHS . "`.`id` WHERE" . $this->GetDateMatch() . " AND `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`domain`!='' ORDER BY `abs` DESC,`title` DESC LIMIT " . DBManager::RealEscape(StatisticProvider::$DayItemAmount) . ";");
|
|
while(($row = DBManager::FetchArray($result)))
|
|
{
|
|
if($row["abs"] > 0 && $_max > 0)
|
|
{
|
|
$url = new BaseURL($row["domain"],$row["path"],"","");
|
|
$results = DBManager::Execute(true, "SELECT dbt.`title` FROM `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_TITLES . "` AS `dbt` ON `dbt`.`id` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`title` WHERE `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`path`='" . DBManager::RealEscape($row["pid"]) . "' AND `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`domain`='" . DBManager::RealEscape($row["did"]) . "';");
|
|
$rows = DBManager::FetchArray($results);
|
|
|
|
$url->Params = "";
|
|
$title = ((!$_title) ? substr(((StatisticProvider::$AggregateDomains)?$url->Path:$url->GetAbsoluteUrl()),0,$_maxlength) : ($rows["title"]));
|
|
if(empty($title))
|
|
$title = "<!--lang_stats_unknown-->";
|
|
$title = "<a href=\"" . @htmlentities(StatisticProvider::$Dereferrer . $url->GetAbsoluteUrl(),ENT_QUOTES,'UTF-8')."\" target=\"_blank\">" . $title . "</a>";
|
|
$this->Tops[$_id][++$counter] = array($title,Num::Divide((100*$row["abs"]),$_max,StatisticProvider::$RoundPrecision),100-Num::Divide((100*$row["abs"]),$_max,false,true),$row["abs"]);
|
|
}
|
|
}
|
|
if($counter==0)
|
|
$this->Tops[$_id][++$counter] = array("<!--lang_stats_none-->",0,100,0);
|
|
}
|
|
|
|
function LoadSearchEngineTable($_id,$_maxlength,$counter=0)
|
|
{
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT SUM(`amount`) AS `total` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_SEARCH_ENGINES . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` ON `" . DB_PREFIX . DATABASE_STATS_AGGS_SEARCH_ENGINES . "`.`domain` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`id` WHERE `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`domain` != '' AND" . $this->GetDateMatch() . " LIMIT " . DBManager::RealEscape(StatisticProvider::$DayItemAmount) . ";"));
|
|
$_total = $row["total"];
|
|
|
|
$result = DBManager::Execute(true, "SELECT `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`domain`,`amount` AS `tam` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_SEARCH_ENGINES . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` ON `" . DB_PREFIX . DATABASE_STATS_AGGS_SEARCH_ENGINES . "`.`domain` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`id` WHERE" . $this->GetDateMatch() . " ORDER BY `tam` DESC LIMIT " . DBManager::RealEscape(StatisticProvider::$DayItemAmount) . ";");
|
|
while(($row = DBManager::FetchArray($result)))
|
|
{
|
|
if(!empty($row["domain"]))
|
|
{
|
|
$url = new BaseURL($row["domain"],"","","");
|
|
$title = "<a href=\"" . @htmlentities(StatisticProvider::$Dereferrer . $url->GetAbsoluteUrl(),ENT_QUOTES,'UTF-8')."\" target=\"_blank\">" . @htmlentities(substr($url->GetAbsoluteUrl(),0,$_maxlength),ENT_QUOTES,'UTF-8')."</a>";
|
|
$this->Tops[$_id][++$counter] = array($title,Num::Divide((100*$row["tam"]),$_total,StatisticProvider::$RoundPrecision),100-Num::Divide((100*$row["tam"]),$_total,false,true),$row["tam"]);
|
|
}
|
|
}
|
|
if($counter==0)
|
|
$this->Tops[$_id][++$counter] = array("<!--lang_stats_none-->",0,100,0);
|
|
}
|
|
|
|
function LoadKnowledgebaseTables($counter=0)
|
|
{
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT SUM(`views`) AS `vtotal` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` WHERE" . $this->GetNoneAggregatedDateMatch() . ";"));
|
|
$_totalViews = max(1,$row["vtotal"]);
|
|
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`views`) AS `tviews` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` AS `t1` INNER JOIN `" . DB_PREFIX . DATABASE_RESOURCES . "` AS `t2` ON `t1`.`res_id`=`t2`.`id` WHERE" . $this->GetNoneAggregatedDateMatch() . " GROUP BY `res_id` ORDER BY `tviews` DESC LIMIT " . DBManager::RealEscape(StatisticProvider::$DayItemAmount) . ";");
|
|
while(($row = DBManager::FetchArray($result)))
|
|
{
|
|
$title = "<a href=\"".@htmlentities(StatisticProvider::$Dereferrer . LIVEZILLA_URL."knowledgebase.php?article=".Encoding::Base64UrlEncode($row["id"]))."\" target=\"_blank\">" . @htmlentities(Str::Cut($row["title"],56,true))."</a>";
|
|
$this->Tops[28][++$counter] = array($title,Num::Divide((100*$row["tviews"]),$_totalViews,StatisticProvider::$RoundPrecision),100-Num::Divide((100*$row["tviews"]),$_totalViews,false,true),$row["tviews"]);
|
|
}
|
|
|
|
if($counter==0)
|
|
$this->Tops[28][++$counter] = array("<!--lang_stats_none-->",0,100,0);
|
|
|
|
$min_votes = 1;
|
|
$sort_alg = "((`rate_amount` / (`rate_amount`+".$min_votes.")) * ((`rate_positive`*100)/`rate_amount`) + (".$min_votes." / (`rate_amount`+".$min_votes.")) * 0.5) as `orderate`";
|
|
$ratingtypes = array(27=>"DESC",26=>"ASC");
|
|
foreach($ratingtypes as $id => $sorting)
|
|
{
|
|
$counter=0;
|
|
$result = DBManager::Execute(true, "SELECT *,((`rate_positive`*100)/`rate_amount`) as `avgrate`," . $sort_alg . " FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_KNOWLEDGEBASE . "` AS `t1` INNER JOIN `" . DB_PREFIX . DATABASE_RESOURCES . "` AS `t2` ON `t1`.`res_id`=`t2`.`id` WHERE" . $this->GetNoneAggregatedDateMatch() . " AND `rate_amount`>=" . $min_votes . " GROUP BY `res_id` ORDER BY `orderate` " . $sorting . " LIMIT " . DBManager::RealEscape(StatisticProvider::$DayItemAmount) . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
$title = "<a href=\"".@htmlentities(StatisticProvider::$Dereferrer . LIVEZILLA_URL."knowledgebase.php?article=".Encoding::Base64UrlEncode($row["id"]))."\" target=\"_blank\">" . @htmlentities(Str::Cut($row["title"],56,true))."</a>";
|
|
$this->Tops[$id][++$counter] = array($title,@round($row["avgrate"],StatisticProvider::$RoundPrecision),0,$row["rate_positive"] . " / " . $row["rate_amount"]);
|
|
}
|
|
|
|
if($counter==0)
|
|
$this->Tops[$id][++$counter] = array("<!--lang_stats_none-->",0,100,0);
|
|
}
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT SUM(`amount`) AS `qtotal` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_QUERIES . "` WHERE" . $this->GetDateMatch() . " AND type=1;"));
|
|
$_totalQueries = $row["qtotal"];
|
|
|
|
$counter=0;
|
|
$result = DBManager::Execute(true, "SELECT *,SUM(`amount`) AS `tamount` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS_QUERIES . "` AS `t1` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_QUERIES . "` AS `t2` ON `t1`.`query`=`t2`.`id` WHERE" . $this->GetDateMatch() . " AND `type`=1 GROUP BY `t1`.`query` ORDER BY `amount` DESC LIMIT " . DBManager::RealEscape(StatisticProvider::$DayItemAmount) . ";");
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
$title = "<a href=\"".@htmlentities(StatisticProvider::$Dereferrer . LIVEZILLA_URL."knowledgebase.php?eq=".Encoding::Base64UrlEncode($row["query"]))."\" target=\"_blank\">" . @htmlentities(Str::Cut($row["query"],56,true))."</a>";
|
|
$this->Tops[29][++$counter] = array($title,Num::Divide((100*$row["tamount"]),$_totalQueries,StatisticProvider::$RoundPrecision),0,$row["tamount"]);
|
|
}
|
|
|
|
if($counter==0)
|
|
$this->Tops[29][++$counter] = array("<!--lang_stats_none-->",0,100,0);
|
|
}
|
|
|
|
function LoadReferrerTable($_id,$_maxlength,$_table,$_fullUrl,$_total,$_group="",$counter=0)
|
|
{
|
|
if(!empty($_group))
|
|
{
|
|
$amount = "SUM(`amount`)";
|
|
$groupBy = " GROUP BY " . $_group;
|
|
}
|
|
else
|
|
{
|
|
$amount = "`amount`";
|
|
$groupBy = "";
|
|
}
|
|
|
|
$row = DBManager::FetchArray(DBManager::Execute(true, "SELECT SUM(`amount`) as `total` FROM `" . DB_PREFIX . $_table . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` ON `" . DB_PREFIX . $_table . "`.`referrer` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` ON `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`domain` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PATHS . "` ON `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`path` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_PATHS . "`.`id` AND `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`domain` != '' WHERE" . $this->GetDateMatch() . " LIMIT " . DBManager::RealEscape(StatisticProvider::$DayItemAmount) . ";"));
|
|
$_total = $row["total"];
|
|
|
|
$result = DBManager::Execute(true, "SELECT `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`domain`,`" . DB_PREFIX . DATABASE_VISITOR_DATA_PATHS . "`.`path`," . $amount . " AS `tam` FROM `" . DB_PREFIX . $_table . "` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "` ON `" . DB_PREFIX . $_table . "`.`referrer` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "` ON `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`domain` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_DOMAINS . "`.`id` INNER JOIN `" . DB_PREFIX . DATABASE_VISITOR_DATA_PATHS . "` ON `" . DB_PREFIX . DATABASE_VISITOR_DATA_PAGES . "`.`path` = `" . DB_PREFIX . DATABASE_VISITOR_DATA_PATHS . "`.`id` WHERE" . $this->GetDateMatch() . "" . $groupBy . " ORDER BY `tam` DESC LIMIT " . DBManager::RealEscape(StatisticProvider::$DayItemAmount) . ";");
|
|
while(($row = DBManager::FetchArray($result)))
|
|
{
|
|
if(!empty($row["domain"]))
|
|
{
|
|
$url = new BaseURL($row["domain"],(($_fullUrl)?$row["path"]:""),"","");
|
|
$title = "<a href=\"" . @htmlentities(StatisticProvider::$Dereferrer . $url->GetAbsoluteUrl(),ENT_QUOTES,'UTF-8')."\" target=\"_blank\">" . @htmlentities(substr($url->GetAbsoluteUrl(),0,$_maxlength),ENT_QUOTES,'UTF-8')."</a>";
|
|
$this->Tops[$_id][++$counter] = array($title,Num::Divide((100*$row["tam"]),$_total,StatisticProvider::$RoundPrecision),100-Num::Divide((100*$row["tam"]),$_total,false,true),$row["tam"]);
|
|
}
|
|
}
|
|
if($counter==0)
|
|
$this->Tops[$_id][++$counter] = array("<!--lang_stats_none-->",0,100,0);
|
|
}
|
|
|
|
function LoadTopTable($_id,$_maxlength,$_tables,$_fields,$_blanks,$_relSource,$_isURL=false,$_countField="amount",$_orderField="amount",$_direction="DESC")
|
|
{
|
|
$counter=0;
|
|
if($_relSource > 0)
|
|
{
|
|
if(count($_tables) == 2)
|
|
{
|
|
$_blanks = ($_blanks === true) ? "" : (($_blanks === false) ? " AND `".DB_PREFIX.DBManager::RealEscape($_tables[1])."`.`".DBManager::RealEscape($_fields[0])."`!=''" : $_blanks);
|
|
$result = DBManager::Execute(true, "SELECT `" . DB_PREFIX . DBManager::RealEscape($_tables[1]) . "`.`" . DBManager::RealEscape($_fields[0]) . "`,`" . $_countField . "` FROM `" . DB_PREFIX . DBManager::RealEscape($_tables[0]) . "` INNER JOIN `" . DB_PREFIX . DBManager::RealEscape($_tables[1]) . "` ON `" . DB_PREFIX . DBManager::RealEscape($_tables[0]) . "`.`" . DBManager::RealEscape($_fields[1]) . "`=`" . DB_PREFIX . DBManager::RealEscape($_tables[1]) . "`.`id` WHERE " . $this->GetDateMatch() . $_blanks . " ORDER BY `" . $_orderField . "` " . $_direction . " LIMIT " . DBManager::RealEscape(StatisticProvider::$DayItemAmount) . ";");
|
|
}
|
|
else
|
|
$result = DBManager::Execute(true, "SELECT `" . DB_PREFIX . DBManager::RealEscape($_tables[0]) . "`.`" . DBManager::RealEscape($_fields[0]) . "`,`" . $_countField . "` FROM `" . DB_PREFIX . DBManager::RealEscape($_tables[0]) . "` WHERE " . $this->GetDateMatch() . " ORDER BY `" . $_orderField . "` " . $_direction . " LIMIT " . DBManager::RealEscape(StatisticProvider::$DayItemAmount) . ";");
|
|
|
|
$values = array();
|
|
while($row = DBManager::FetchArray($result))
|
|
{
|
|
if(!Is::Null(trim($row[$_fields[0]])))
|
|
{
|
|
if($_id != 6)
|
|
$row[$_fields[0]] = ($_isURL) ? "<a href=\"" . @htmlentities(StatisticProvider::$Dereferrer . $row[$_fields[0]],ENT_QUOTES,'UTF-8')."\" target=\"_blank\">" . @htmlentities(substr($row[$_fields[0]],0,$_maxlength),ENT_QUOTES,'UTF-8')."</a>" : @htmlentities(substr($row[$_fields[0]],0,$_maxlength),ENT_QUOTES,'UTF-8');
|
|
else
|
|
$row[$_fields[0]] = $row[$_fields[0]];
|
|
|
|
$title = $row[$_fields[0]];
|
|
}
|
|
else
|
|
$title = "<!--lang_stats_unknown-->";
|
|
|
|
if(!isset($values[$title]))
|
|
$values[$title]=0;
|
|
|
|
$values[$title]+=$row[$_countField];
|
|
}
|
|
foreach($values as $title => $amount)
|
|
$this->Tops[$_id][++$counter] = array($title,Num::Divide((100*$amount),$_relSource,StatisticProvider::$RoundPrecision),100-Num::Divide((100*$amount),$_relSource),$amount);
|
|
}
|
|
if($counter==0)
|
|
$this->Tops[$_id][++$counter] = array("<!--lang_stats_none-->",0,100,0);
|
|
}
|
|
|
|
function RenderTopURLTable($_id,$_title,$_column,$_trend=true,$_tabTitle1="URL",$_tabTitle2="<!--lang_stats_titles-->",$html="")
|
|
{
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
$html = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_URL_TABLE);
|
|
for($i=1;$i<=2;$i++)
|
|
{
|
|
$crow = "";
|
|
|
|
if(!is_array($this->Tops[$_id+($i-1)]))
|
|
{
|
|
return "";
|
|
}
|
|
|
|
foreach($this->Tops[$_id+($i-1)] as $count => $values)
|
|
{
|
|
$crow .= str_replace("<!--title-->",$values[0],$hrow);
|
|
$crow = str_replace("<!--rel_amount-->",$values[1],$crow);
|
|
$crow = str_replace("<!--rel_floor_amount-->",$values[2],$crow);
|
|
$crow = str_replace("<!--abs_amount-->",number_format($values[3],0,".","."),$crow);
|
|
$crow = str_replace("<!--trend-->","const",$crow);
|
|
$crow = str_replace("<!--count-->",$count,$crow);
|
|
}
|
|
$html = str_replace("<!--rows_".$i."-->",$crow,$html);
|
|
}
|
|
$html = str_replace("<!--column_value_title-->",$_column,$html);
|
|
$html = str_replace("<!--id-->",$_id,$html);
|
|
$html = str_replace("<!--tab_title_1-->",$_tabTitle1,$html);
|
|
$html = str_replace("<!--tab_title_2-->",$_tabTitle2,$html);
|
|
$html = str_replace("<!--id-->",$_id,$html);
|
|
return str_replace("<!--title-->",$_title,$html);
|
|
}
|
|
|
|
function RenderTopTable($_id,$_title,$_column,$_trend=true,$crow = "")
|
|
{
|
|
$hrow = IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_ROW);
|
|
if($_id==6)
|
|
Server::InitDataBlock(array("LANGUAGES"));
|
|
else if($_id==2)
|
|
Server::InitDataBlock(array("COUNTRIES"));
|
|
|
|
if(!isset($this->Tops[$_id]))
|
|
Logging::DebugLog("Invalid tops:" . $_id);
|
|
else
|
|
foreach($this->Tops[$_id] as $count => $values)
|
|
{
|
|
if($_id==6 && isset(Server::$Languages[strtoupper($values[0])][0]))
|
|
$crow .= str_replace("<!--title-->",Server::$Languages[strtoupper($values[0])][0],$hrow);
|
|
else if($_id==2 && isset(Server::$Countries[strtoupper($values[0])]))
|
|
$crow .= str_replace("<!--title-->",Server::$Countries[strtoupper($values[0])],$hrow);
|
|
else if($_id==13 && isset(StatisticProvider::$Durations[$values[0]]))
|
|
$crow .= str_replace("<!--title-->",StatisticProvider::$Durations[$values[0]],$hrow);
|
|
else
|
|
$crow .= str_replace("<!--title-->",$values[0],$hrow);
|
|
|
|
$crow = str_replace("<!--rel_amount-->",$values[1],$crow);
|
|
$crow = str_replace("<!--rel_floor_amount-->",$values[2],$crow);
|
|
if(!is_numeric($values[3]) && strpos($values[3]," / ") !== false)
|
|
$crow = str_replace("<!--abs_amount-->",$values[3],$crow);
|
|
else
|
|
$crow = str_replace("<!--abs_amount-->",number_format($values[3],0,".","."),$crow);
|
|
$crow = str_replace("<!--trend-->","const",$crow);
|
|
$crow = str_replace("<!--count-->",$count,$crow);
|
|
}
|
|
$html = str_replace("<!--rows-->",$crow,IOStruct::GetFile(TEMPLATE_HTML_STATS_TOP_TABLE));
|
|
$html = str_replace("<!--column_count_width-->","16",$html);
|
|
$html = str_replace("<!--expand_all-->","none",$html);
|
|
$html = str_replace("<!--expand_all_block-->","",$html);
|
|
$html = str_replace("<!--column_value_title-->",$_column,$html);
|
|
return str_replace("<!--title-->",$_title,$html);
|
|
}
|
|
|
|
function GetHash()
|
|
{
|
|
return (md5($this->Type . $this->Aggregated . $this->Microtime));
|
|
}
|
|
|
|
function GetGraphOperatorIndex($_user)
|
|
{
|
|
return Str::Cut($_user->Fullname,15,true);
|
|
}
|
|
|
|
function GetGraphWidth()
|
|
{
|
|
if(!StatisticProvider::$DrawChartImages || !function_exists("gd_info"))
|
|
return "0px";
|
|
return StatisticProvider::$GraphOverallWidth . "px";
|
|
}
|
|
|
|
function GetGraphImageTag($_data,$_texts,$_metric=true)
|
|
{
|
|
if(!StatisticProvider::$DrawChartImages || !function_exists("gd_info"))
|
|
return "";
|
|
|
|
require_once(LIVEZILLA_PATH . "_lib/trdp/pchart/class/pData.class.php");
|
|
require_once(LIVEZILLA_PATH . "_lib/trdp/pchart/class/pDraw.class.php");
|
|
require_once(LIVEZILLA_PATH . "_lib/trdp/pchart/class/pImage.class.php");
|
|
|
|
$MyData = new pData();
|
|
$dv1 = array();
|
|
$dobject = array();
|
|
foreach($_data as $obid => $values)
|
|
{
|
|
foreach($values as $key => $val)
|
|
$values[$key] = round($val,1);
|
|
|
|
$dv1[] = $values[0];
|
|
if(count($values) > 1)
|
|
$dv2[] = $values[1];
|
|
if(count($values) > 2)
|
|
$dv3[] = $values[2];
|
|
if(count($values) > 3)
|
|
$dv4[] = $values[3];
|
|
$dobject[] = $obid;
|
|
if(count($dobject) == 5)
|
|
break;
|
|
}
|
|
|
|
if(isset($_texts[1]))
|
|
{
|
|
|
|
$MyData->addPoints($dv1,$_texts[1]." ");
|
|
if(isset($dv2) && isset($_texts[2]))
|
|
$MyData->addPoints($dv2,$_texts[2]." ");
|
|
if(isset($dv3) && isset($_texts[3]))
|
|
$MyData->addPoints($dv3,$_texts[3]." ");
|
|
if(isset($dv4) && isset($_texts[4]))
|
|
$MyData->addPoints($dv4,$_texts[4]." ");
|
|
|
|
$MyData->setAxisName(0,$_texts[0]);
|
|
$MyData->setAxisDisplay(0,$_metric ? AXIS_FORMAT_METRIC : AXIS_FORMAT_RAW);
|
|
$MyData->addPoints($dobject,"Groups");
|
|
$MyData->setSerieDescription("Groups","Group");
|
|
$MyData->setAbscissa("Groups");
|
|
$myPicture = new pImage(630,210,$MyData);
|
|
$myPicture->Antialias = FALSE;
|
|
$myPicture->setFontProperties(array("FontName"=>LIVEZILLA_PATH . "_lib/trdp/pchart/fonts/arimo.ttf","FontSize"=>8,"R"=>120,"G"=>120,"B"=>120));
|
|
$myPicture->setGraphArea(46,0,620,160);
|
|
$scaleSettings = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"YMargin"=>12,"CycleBackground"=>TRUE);
|
|
$myPicture->drawScale($scaleSettings);
|
|
$myPicture->drawLegend(40,190,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL,"BoxSize"=>4,"R"=>200,"G"=>200,"B"=>200,"Surrounding"=>20,"Alpha"=>30));
|
|
$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
|
|
$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
|
|
$settings = array("Surrounding"=>-30,"InnerSurrounding"=>30,"DisplayValues"=>TRUE);
|
|
$myPicture->drawBarChart($settings);
|
|
$file = PATH_STATS . $this->Type . "/temp.png";
|
|
$myPicture->render($file);
|
|
|
|
return "<img src=\"data:image/png;base64,".IOStruct::ToBase64($file)."\" />";
|
|
}
|
|
return "";
|
|
}
|
|
|
|
function FormatTimespan($_span)
|
|
{
|
|
$formatted = "";
|
|
$hrsmins = array(3600,60);
|
|
foreach($hrsmins as $val)
|
|
if($_span >= $val)
|
|
{
|
|
if(Num::Divide($_span,$val,false,true) >= 10)
|
|
$formatted .= Num::Divide($_span,$val,false,true) . ":";
|
|
else
|
|
$formatted .= "0" . Num::Divide($_span,$val,false,true) . ":";
|
|
$_span -= Num::Divide($_span,$val,false,true)*$val;
|
|
}
|
|
else
|
|
$formatted .= "00:";
|
|
if($_span >= 10)
|
|
$formatted .= floor($_span);
|
|
else if($_span > 0)
|
|
$formatted .= "0" . floor($_span);
|
|
else
|
|
$formatted .= "00";
|
|
return $formatted;
|
|
}
|
|
|
|
function Save()
|
|
{
|
|
$time = SystemTime::GetMicroTime();
|
|
DBManager::Execute(true, "INSERT IGNORE INTO `" . DB_PREFIX . DATABASE_STATS_AGGS . "` (`year`,`month`,`day`,`time`,`mtime`) VALUES (" . $this->GetSQLDateValues() . "," . $time[1] . "," . $time[0] . ");");
|
|
}
|
|
|
|
function Update()
|
|
{
|
|
$result = DBManager::Execute(true, "SELECT `time` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE `year`='" . DBManager::RealEscape($this->Year) . "' AND `month`='" . DBManager::RealEscape($this->Month) . "' AND `day`='" . DBManager::RealEscape($this->Day) . "' AND `aggregated`=0 LIMIT 1;");
|
|
if($result)
|
|
{
|
|
if($row = DBManager::FetchArray($result))
|
|
{
|
|
if($this->Type == STATISTIC_PERIOD_TYPE_DAY)
|
|
$this->SaveVisitorListToFile();
|
|
$this->SaveReportToFile();
|
|
}
|
|
else if(@file_exists($this->GetFilename(true,false)))
|
|
{
|
|
$result = DBManager::Execute(true, "SELECT `time`,`mtime` FROM `" . DB_PREFIX . DATABASE_STATS_AGGS . "` WHERE `year`='" . DBManager::RealEscape($this->Year) . "' AND `month`='" . DBManager::RealEscape($this->Month) . "' AND `day`='" . DBManager::RealEscape($this->Day) . "' LIMIT 1;");
|
|
if($result)
|
|
{
|
|
if($row = DBManager::FetchArray($result))
|
|
{
|
|
$parts = explode("_",$_POST[POST_INTERN_XMLCLIP_REPORTS_END_TIME]);
|
|
if($parts[0] > $row["time"])
|
|
$_POST[POST_INTERN_XMLCLIP_REPORTS_END_TIME] = $row["time"] . "_" . ($row["mtime"]-1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function GetFilename($_fullPath,$_visitorList)
|
|
{
|
|
$month = ($this->Type != STATISTIC_PERIOD_TYPE_YEAR) ? "_" . date("m",mktime(0,0,0,$this->Month,1,$this->Year)) : "";
|
|
$day = ($this->Type == STATISTIC_PERIOD_TYPE_DAY) ? "_" . date("d",mktime(0,0,0,$this->Month,$this->Day,$this->Year)) : "";
|
|
if(!$_fullPath)
|
|
return $this->Year . $month . $day . (($_visitorList)?"_u":"") . "_" . StatisticProvider::$StatisticKey;
|
|
else
|
|
return PATH_STATS . $this->Type . "/" . $this->Year . $month . $day . (($_visitorList)?"_u":"") . "_" . StatisticProvider::$StatisticKey;
|
|
}
|
|
|
|
function SaveReportToFile()
|
|
{
|
|
Server::SetTimeLimit(300);
|
|
|
|
if($this->Type == STATISTIC_PERIOD_TYPE_MONTH)
|
|
$this->LoadDays();
|
|
else if($this->Type == STATISTIC_PERIOD_TYPE_YEAR)
|
|
$this->LoadMonths();
|
|
|
|
$this->Aggregate();
|
|
$this->Load();
|
|
|
|
if($this->CreateReport && $this->Loaded)
|
|
IOStruct::CreateFile($this->GetFilename(true, false), $this->GetHTML(), true, true);
|
|
|
|
CacheManager::SetDataUpdateTime(DATA_UPDATE_KEY_REPORTS);
|
|
}
|
|
|
|
function SaveVisitorListToFile()
|
|
{
|
|
Server::SetTimeLimit(300);
|
|
if($this->CreateVisitorList)
|
|
IOStruct::CreateFile($this->GetFilename(true, true), $this->GetVisitorsHTML(), true, true);
|
|
}
|
|
|
|
function SendReportByEmail($email="",$subject="",$date="")
|
|
{
|
|
if($this->Type == STATISTIC_PERIOD_TYPE_DAY)
|
|
{
|
|
$email = Server::$Configuration->File["gl_sred"];
|
|
$subject = LocalizationManager::$TranslationStrings["stats_report_email_subject_day"];
|
|
$date = $this->Year . "-" . date("m",mktime(0,0,0,$this->Month,$this->Day,$this->Year)) . "-" . date("d",mktime(0,0,0,$this->Month,$this->Day,$this->Year));
|
|
}
|
|
else if($this->Type == STATISTIC_PERIOD_TYPE_MONTH)
|
|
{
|
|
$email = Server::$Configuration->File["gl_srem"];
|
|
$subject = LocalizationManager::$TranslationStrings["stats_report_email_subject_month"];
|
|
$date = $this->Year . "-" . date("m",mktime(0,0,0,$this->Month,1,$this->Year));
|
|
}
|
|
else if($this->Type == STATISTIC_PERIOD_TYPE_YEAR)
|
|
{
|
|
$email = Server::$Configuration->File["gl_srey"];
|
|
$subject = LocalizationManager::$TranslationStrings["stats_report_email_subject_year"];
|
|
$date = $this->Year;
|
|
}
|
|
|
|
if(empty($email))
|
|
return;
|
|
|
|
LocalizationManager::AutoLoad(strtolower(Server::$Configuration->File["gl_default_language"]),true);
|
|
$html = Server::Replace($this->GetReportHTML(false),true,false,false,true);
|
|
$tempfile = PATH_STATS . $this->Type . "/temp.html";
|
|
IOStruct::CreateFile($tempfile, $html, true);
|
|
$mailbox = Mailbox::GetDefaultOutgoing();
|
|
|
|
if($mailbox != null)
|
|
Communication::SendEmail($mailbox, $email, "", "", $mailbox->Email, "", "", $subject . " (" . $date . ")", false, Array($tempfile => str_replace("-", "_", $date) . ".html"));
|
|
else
|
|
Logging::ErrorLog("No -default- email account to send reports to mail account.");
|
|
|
|
@unlink($tempfile);
|
|
}
|
|
|
|
function Close()
|
|
{
|
|
Server::InitDataBlock(array("INTERNAL"));
|
|
LocalizationManager::AutoLoad(strtolower(Server::$Configuration->File["gl_default_language"]),true);
|
|
if($this->Type == STATISTIC_PERIOD_TYPE_DAY)
|
|
{
|
|
$dvhd = (isset(Server::$Configuration->File["gl_dvhd"])) ? Server::$Configuration->File["gl_dvhd"] : 3;
|
|
$this->CleanDatabases($dvhd*2);
|
|
if($this->CreateReport)
|
|
{
|
|
$this->SaveReportToFile();
|
|
}
|
|
|
|
if($this->CreateVisitorList)
|
|
{
|
|
$this->SaveVisitorListToFile();
|
|
}
|
|
$this->CleanDatabases($dvhd);
|
|
}
|
|
else if($this->CreateReport)
|
|
$this->SaveReportToFile();
|
|
|
|
$this->SendReportByEmail();
|
|
LocalizationManager::AutoLoad("",true);
|
|
}
|
|
|
|
function CleanDatabases($_days)
|
|
{
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_VISITORS . "` WHERE `closed`<" . (time() - (max(1, $_days) * 86400)) . ";");
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_OPERATOR_STATUS . "` WHERE `" . DB_PREFIX . DATABASE_OPERATOR_STATUS . "`.`confirmed`<" . DBManager::RealEscape(time() - (max(1, $_days) * 86400)) . ";");
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_KNOWLEDGEBASE_QUERIES . "` WHERE `time`<" . (time() - 86400) . ";");
|
|
DBManager::Execute(true, "DELETE FROM `" . DB_PREFIX . DATABASE_KNOWLEDGEBASE_VIEWS . "` WHERE `time`<" . (time() - 86400) . ";");
|
|
}
|
|
}
|
|
?>
|