Files
Phraseanet/lib/classes/dashboard.class.php
2011-02-16 16:09:48 +01:00

645 lines
20 KiB
PHP

<?php
class dashboard
{
public $all_sbas_desc;
public $dmax;
public $dmin;
public $dminv;
public $dmaxv;
public $dmax_req;
public $dmin_req;
public $liste_base;
public $dashboard;
public $nb_days;
public $legendDay;
public $legendHour;
public $unorganised_dahsboard;
public $base;
public $total = array();
public function __construct($usr_id)
{
$datetime_req = new Datetime();
$this->nb_days = 0;
$this->dmax_req = phraseadate::format_mysql($datetime_req);
$this->dmax = $datetime_req->format('d-m-Y');
$this->dmaxv = phraseadate::getPrettyString(new Datetime($this->dmax));
$datetime_req->modify('-1 month'); // Periode des requetes sur le dashboard
$this->dmin_req = phraseadate::format_mysql($datetime_req);
$this->dmin = $datetime_req->format('d-m-Y');
$this->dminv = phraseadate::getPrettyString(new Datetime($this->dmin));
$this->liste_base = ' - ';
$this->base = array();
$this->legendDay = $this->getPlotDayLegend($this->dmin);
$this->legendHour = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23);
$this->all_sbas_desc = array();
$this->getAllSbas($usr_id);
$this->getDataFromAllSbas();
$this->initDashboard();
$this->fillDataInDahsboard();
$this->sortDashboard();
$this->formatDashboard();
}
/**
* @desc return the legend for the activity by day
* @param $dmin minimum date of the current report
* @return array
*/
private function getPlotDayLegend($dmin)
{
$date = new Datetime();
$dmax = $date->format('d-m-Y');
$array = array();
$array[] = phraseadate::getPrettyString($date);
while ($dmin != $dmax)
{
$date->modify('-1 day');
$dmax = $date->format('d-m-Y');
$array[] = phraseadate::getPrettyString($date);
$this->nb_days++;
}
$array = array_reverse($array);
return($array);
}
/**
* @desc return allsbas where the current user can report
* @param $usr_id the id of the user
* @return void
*/
private function getAllSbas($usr_id)
{
$lb = phrasea::bases();
$user = user::getInstance($usr_id);
$all_coll = array() ;
foreach($lb['bases'] as $sbas)
{
if(connection::getInstance($sbas['sbas_id']))
{
foreach($sbas['collections'] as $coll)
{
if(!isset($user->_rights_bas[$coll['base_id']]) || !$user->_rights_bas[$coll['base_id']]['canreport'])
continue;
if(!isset($all_coll[$sbas['sbas_id']]))
{
$all_coll[$sbas['sbas_id']] = array();
}
$all_coll[$sbas['sbas_id']]['sbas_collections'][] = array(
'base_id' => $coll['base_id'],
'sbas_id' => $sbas['sbas_id'],
'coll_id'=>$coll['coll_id'],
'name'=>phrasea::bas_names($coll['base_id'])
);
}
}
}
foreach($all_coll as $sbas => $info)
{
$liste ="";
$this->liste_base .= phrasea::sbas_names($sbas)." - ";
$this->all_sbas_desc[$sbas]['name'] = phrasea::sbas_names($sbas);
foreach($info['sbas_collections'] as $key => $value)
{
$liste .= (empty($liste) ? '': ',') . $value['coll_id'];
}
$this->all_sbas_desc[$sbas]['server_coll_list'] = $liste;
$this->base[] = array('base_id' => $sbas, 'coll' => $liste);
}
}
/**
* @desc recover all data
* @return void
*/
private function getDataFromAllSbas()
{
foreach($this->all_sbas_desc as $sbas_id => $array)
{
$this->all_sbas_desc[$sbas_id]['nb_dl'] = report_download::getNbDl($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"]);
$this->all_sbas_desc[$sbas_id]['nb_conn'] = report_connexion::getNbConn($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"]);
if(GV_anonymousReport == false)
$this->all_sbas_desc[$sbas_id]['top_ten_user'] = report_activity::topTenUser($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"]);
$this->all_sbas_desc[$sbas_id]['activity'] = report_activity::activity($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"]);
$this->all_sbas_desc[$sbas_id]['activity_day'] = report_activity::activityDay($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"], $this->nb_days);
$this->all_sbas_desc[$sbas_id]['top_dl'] = report_download::getTopDl($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"]);
if(GV_anonymousReport == false)
$this->all_sbas_desc[$sbas_id]['ask'] = report_activity::activityQuestion($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"]);
$this->all_sbas_desc[$sbas_id]['top_ten_site']= report_activity::activiteTopTenSiteView($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"]);
$this->all_sbas_desc[$sbas_id]['top_ten_question']= report_activity::activiteTopQuestion($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"]);
$this->all_sbas_desc[$sbas_id]['activity_added'] = report_activity::activiteAddedDocument($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"]);
$this->all_sbas_desc[$sbas_id]['activity_edited'] = report_activity::activiteEditedDocument($this->dmin_req, $this->dmax_req, $sbas_id, $array["server_coll_list"]);
}
}
/**
* @desc init the dashboard
* @return void
*/
private function initDashboard()
{
$this->unorganised_dashboard = array();
$this->unorganised_dashboard['top_ten_user']['nbdoc'] = array();
$this->unorganised_dashboard['top_ten_user']['nbprev'] = array();
$this->unorganised_dashboard['top_ten_user']['poiddoc'] = array();
$this->unorganised_dashboard['top_ten_user']['poidprev'] = array();
$this->unorganised_dashboard['top_dl']['document'] = array();
$this->unorganised_dashboard['top_dl']['preview'] = array();
$this->unorganised_dashboard['ask'] = array();
$this->unorganised_dashboard['top_ten_site'] = array();
$this->unorganised_dashboard['top_ten_question'] = array();
$this->dashboard = array();
$this->dashboard['nb_dl'] = 0;
$this->dashboard['nb_conn'] = 0;
$this->dashboard['top_ten_user']['nbdoc'] = array();
$this->dashboard['top_ten_user']['nbprev'] = array();
$this->dashboard['top_ten_user']['poiddoc'] = array();
$this->dashboard['top_ten_user']['poidprev'] = array();
$this->dashboard['activity'] = array();
$this->dashboard['activity_day'] = array();
$this->dashboard['activity_added'] = array();
$this->dashboard['activity_edited'] = array();
$this->dashboard['top_dl']['document'] = array();
$this->dashboard['top_dl']['preview'] = array();
$this->dashboard['ask'] = array();
$this->dashboard['top_ten_site'] = array();
$this->dashboard['top_ten_question'] = array();
}
/**
* @desc fill all data in the unoganised dashboard
* @return void
*/
private function fillDataInDahsboard()
{
foreach($this->all_sbas_desc as $sbas_id => $array)
{
$i = 0;
////////////on ajoute toutes les connexions et les dl de chaque base
$this->dashboard['nb_dl'] += $array['nb_dl'];
$this->dashboard['nb_conn'] += $array['nb_conn'];
////////////si il y a des resultats on cumul les users les plus actif (doc)
if(isset($array['top_ten_user']) && sizeof($array['top_ten_user']) > 0)
{
foreach($array['top_ten_user'] as $id => $stat)
{
if(array_key_exists($id, $this->unorganised_dashboard['top_ten_user']))
{
$this->unorganised_dashboard['top_ten_user'][$id]['nbdoc'] += $stat['nbdoc'];
$this->unorganised_dashboard['top_ten_user'][$id]['poiddoc'] += $stat['poiddoc'];
$this->unorganised_dashboard['top_ten_user'][$id]['nbprev'] += $stat['nbprev'];
$this->unorganised_dashboard['top_ten_user'][$id]['poidprev'] += $stat['poidprev'];
}
else
{
$this->unorganised_dashboard['top_ten_user'][$id]['user'] = $stat['user'];
$this->unorganised_dashboard['top_ten_user'][$id]['nbdoc'] = $stat['nbdoc'];
$this->unorganised_dashboard['top_ten_user'][$id]['poiddoc'] = $stat['poiddoc'];
$this->unorganised_dashboard['top_ten_user'][$id]['nbprev'] = $stat['nbprev'];
$this->unorganised_dashboard['top_ten_user'][$id]['poidprev'] = $stat['poidprev'];
}
}
}
if(sizeof($array['top_ten_site']) > 0)
{
foreach($array['top_ten_site'] as $referrer => $nb)
{
if(array_key_exists($referrer, $this->unorganised_dashboard['top_ten_site']))
{
$this->unorganised_dashboard['top_ten_site'][$referrer] += $nb;
}
else
{
$this->unorganised_dashboard['top_ten_site'][$referrer] = $nb;
}
}
}
////////////si il y a des resultats on cumule tout les documents les plus dl
if(sizeof($array['top_dl']['document']) > 0)
{
foreach($array['top_dl']['document'] as $id => $stat)
{
if(!empty($id))
{
if(array_key_exists($id, $this->unorganised_dashboard['top_dl']['document']))
$this->unorganised_dashboard['top_dl']['document'][$id]['nbdoc'] += $stat['nb'];
else
{
$this->unorganised_dashboard['top_dl']['document'][$id]['user'] = $stat['file'];
$this->unorganised_dashboard['top_dl']['document'][$id]['nbdoc'] = $stat['nb'];
$this->unorganised_dashboard['top_dl']['document'][$id]['sbasid'] = $stat['sbasid'];
}
}
}
}
///////////si il y a des resultats on cumule tout les preview les plus dl
if(sizeof($array['top_dl']['preview']) > 0)
{
foreach($array['top_dl']['preview'] as $id => $stat)
{
if(!empty($id))
{
if(array_key_exists($id, $this->unorganised_dashboard['top_dl']['preview']))
$this->unorganised_dashboard['top_dl']['preview'][$id]['nbdoc'] += $stat['nb'];
else
{
$this->unorganised_dashboard['top_dl']['preview'][$id]['user'] = $stat['file'];
$this->unorganised_dashboard['top_dl']['preview'][$id]['nbdoc'] = $stat['nb'];
$this->unorganised_dashboard['top_dl']['preview'][$id]['sbasid'] = $stat['sbasid'];
}
}
}
}
///////si il ya des resultats on cumul le nombre de toutes les questions posees
if(isset($array['top_ten_user']) && sizeof($array['ask']) > 0)
{
foreach($array['ask'] as $id => $stat)
{
if(!empty($id))
{
if(array_key_exists($id, $this->unorganised_dashboard['ask']))
$this->unorganised_dashboard['ask'][$id]['question'] += $stat['nb'];
else
{
$this->unorganised_dashboard['ask'][$id]['user'] = $stat['user'];
$this->unorganised_dashboard['ask'][$id]['question'] = $stat['nb'];
}
}
}
}
//////
if(sizeof($array['top_ten_question']) > 0)
{
foreach($array['top_ten_question'] as $key => $info)
{
if(array_key_exists($key, $this->unorganised_dashboard['top_ten_question']))
{
$this->unorganised_dashboard['top_ten_question'][$key]['nb'] += $info['nb'];
}
else
{
$this->unorganised_dashboard['top_ten_question'][$key]['question'] = $info['question'];
$this->unorganised_dashboard['top_ten_question'][$key]['nb'] = $info['nb'];
}
}
}
/////////////on cumule toutes les resultats des activitees par heures
$i = 0;
while($i < 24)
{
if(sizeof($array['activity']) > 0)
{
if(!isset($this->dashboard['activity']['value'][$i]))
$this->dashboard['activity']['value'][$i] = (float)0;
if(isset($array['activity'][$i]))
$this->dashboard['activity']['value'][$i] += $array['activity'][$i];
$i++;
}
}
////////////on cumule toutes les resultats des activitees par jours
$i = 0;
foreach($this->legendDay as $key => $date)
{
if(sizeof($array['activity_day']) > 0)
{
if(!isset($this->total['activity_day'][$i]))
$this->total['activity_day'][$i] = (float)0;
if(array_key_exists($date, $array['activity_day']))
$this->total['activity_day'][$i] += (float)$array['activity_day'][$date];
}
if(sizeof($array['activity_day']) > 0)
{
if(!isset($this->dashboard['activity_day'][$sbas_id][$i]))
$this->dashboard['activity_day'][$sbas_id][$i] = 0;
if(array_key_exists($date, $array['activity_day']))
$this->dashboard['activity_day'][$sbas_id][$i] += $array['activity_day'][$date];
}
if(sizeof($array['activity_added']) > 0)
{
if(!isset($this->dashboard['activity_added']['value'][$i]))
$this->dashboard['activity_added']['value'][$i] = 0;
if(array_key_exists($date, $array['activity_added']))
$this->dashboard['activity_added']['value'][$i] += $array['activity_added'][$date];
}
if(sizeof($array['activity_edited']) > 0)
{
if(!isset($this->dashboard['activity_edited']['value'][$i]))
$this->dashboard['activity_edited']['value'][$i] = 0;
if(array_key_exists($date, $array['activity_edited']))
$this->dashboard['activity_edited']['value'][$i] += $array['activity_edited'][$date];
}
$i++;
}
}
}
private function sortDataTopTenNbDlWeight()
{
if(sizeof($this->unorganised_dashboard['top_ten_user']['nbdoc']) > 0)
{
/////On tri par nb document
foreach($this->unorganised_dashboard['top_ten_user'] as $key => $value)
{
$tri[$key] = $value['nbdoc'];
}
arsort($tri);
/////On tri par poid des documents
foreach($this->unorganised_dashboard['top_ten_user'] as $key => $value)
{
$tri2[$key] = $value['poiddoc'];
}
arsort($tri2);
/////on reorganise $dashboard en fonction du tri pour les docs
$i = 0;
foreach($tri as $key => $nbdoc)
{
if($i < 10 && $this->unorganised_dashboard['top_ten_user'][$key]['nbdoc'] != 0)
{
$this->dashboard['top_ten_user']['nbdoc'][$key]['user'] = $this->unorganised_dashboard['top_ten_user'][$key]['user'];
$this->dashboard['top_ten_user']['nbdoc'][$key]['nbdoc'] = $this->unorganised_dashboard['top_ten_user'][$key]['nbdoc'];
$i++;
}
else
break;
}
//////on reorganise $dashboard en fonction du tri pour le poid des docs
$i = 0;
foreach($tri2 as $key => $poiddoc)
{
if($i < 10 && $this->unorganised_dashboard['top_ten_user'][$key]['poiddoc'] != 0)
{
$this->dashboard['top_ten_user']['poiddoc'][$key]['user'] = $this->unorganised_dashboard['top_ten_user'][$key]['user'];
$this->dashboard['top_ten_user']['poiddoc'][$key]['poiddoc'] = $this->unorganised_dashboard['top_ten_user'][$key]['poiddoc'];
$i++;
}
else
break;
}
}
if(sizeof($this->unorganised_dashboard['top_ten_user']['nbprev']) > 0)
{
/////On tri par nb document
foreach($this->unorganised_dashboard['top_ten_user'] as $key => $value)
{
$tri8[$key] = $value['nbprev'];
}
arsort($tri8);
/////On tri par poid des documents
foreach($this->unorganised_dashboard['top_ten_user'] as $key => $value)
{
$tri9[$key] = $value['poidprev'];
}
arsort($tri9);
/////on reorganise $dashboard en fonction du tri pour les prev
$i = 0;
foreach($tri8 as $key => $nbprev)
{
if($i < 10 && $this->unorganised_dashboard['top_ten_user'][$key]['nbprev'] != 0)
{
$this->dashboard['top_ten_user']['nbprev'][$key]['user'] = $this->unorganised_dashboard['top_ten_user'][$key]['user'];
$this->dashboard['top_ten_user']['nbprev'][$key]['nbprev'] = $this->unorganised_dashboard['top_ten_user'][$key]['nbprev'];
$i++;
}
else
break;
}
//////on reorganise $dashboard en fonction du tri pour le poid des docs
$i = 0;
foreach($tri9 as $key => $poidprev)
{
if($i < 10 && $this->unorganised_dashboard['top_ten_user'][$key]['poidprev'] != 0)
{
$this->dashboard['top_ten_user']['poidprev'][$key]['user'] = $this->unorganised_dashboard['top_ten_user'][$key]['user'];
$this->dashboard['top_ten_user']['poidprev'][$key]['poidprev'] = $this->unorganised_dashboard['top_ten_user'][$key]['poidprev'];
$i++;
}
else
break;
}
}
}
private function sortTopTenDocDl()
{
//////si il y a des resultats le top ten doc dl
if(sizeof($this->unorganised_dashboard['top_dl']['document']) > 0)
{
/////On tri top_dl
foreach($this->unorganised_dashboard['top_dl']['document'] as $key => $value)
$tri3[$key] = $value['nbdoc'];
arsort($tri3);
//////on reorganise $dashboard en fonction du tri
$i = 0;
foreach($tri3 as $key => $nb)
{
if($i < 10)
$this->dashboard['top_dl']['document'][$key] = $this->unorganised_dashboard['top_dl']['document'][$key];
else
break;
$i++;
}
}
}
private function sortTopTenPrevDl()
{
//////si il y a des resultats le top ten doc dl
if(sizeof($this->unorganised_dashboard['top_dl']['preview']) > 0)
{
/////On tri top_dl
foreach($this->unorganised_dashboard['top_dl']['preview'] as $key => $value)
$tri3[$key] = $value['nbdoc'];
arsort($tri3);
//////on reorganise $dashboard en fonction du tri
$i = 0;
foreach($tri3 as $key => $nb)
{
if($i < 10)
$this->dashboard['top_dl']['preview'][$key] = $this->unorganised_dashboard['top_dl']['preview'][$key];
else
break;
$i++;
}
}
}
private function sortTopTenSite()
{
//////si il y a des resultats le top ten doc dl
if(sizeof($this->unorganised_dashboard['top_ten_site']) > 0)
{
/////On tri top_dl
foreach($this->unorganised_dashboard['top_ten_site'] as $referrer => $value)
$tri5[$referrer] = $value;
arsort($tri5);
//////on reorganise $dashboard en fonction du tri
$i = 0;
foreach($tri5 as $key => $nb)
{
if($i < 10)
$this->dashboard['top_ten_site'][$key] = $this->unorganised_dashboard['top_ten_site'][$key];
else
break;
$i++;
}
}
}
private function sortTopTenQuestion()
{
if(sizeof($this->unorganised_dashboard['ask']) > 0)
{
/////On tri top_dl
foreach($this->unorganised_dashboard['ask'] as $key => $value)
$tri4[$key] = $value['question'];
arsort($tri4);
//////on reorganise $dashboard en fonction du tri
$i = 0;
foreach($tri4 as $key => $nb)
{
if($i < 10)
$this->dashboard['ask'][$key] = $this->unorganised_dashboard['ask'][$key];
else
break;
$i++;
}
}
}
private function sortTopTenNbQuestion()
{
if(sizeof($this->unorganised_dashboard['top_ten_question']) > 0)
{
/////On tri top_dl
foreach($this->unorganised_dashboard['top_ten_question'] as $key => $value)
$tri5[$key] = $value['nb'];
arsort($tri5);
//////on reorganise $dashboard en fonction du tri
$i = 0;
foreach($tri5 as $key => $nb)
{
if($i < 10)
$this->dashboard['top_ten_question'][$key] = $this->unorganised_dashboard['top_ten_question'][$key];
else
break;
$i++;
}
}
}
/**
* @desc sort the dashboard
* @return void
*/
private function sortDashboard()
{
$this->sortDataTopTenNbDlWeight();
$this->sortTopTenDocDl();
$this->sortTopTenQuestion();
$this->sortTopTenSite();
$this->sortTopTenNbQuestion();
$this->sortTopTenPrevDl();
}
/**
* @desc draw html tabl for nb download and nb connexion on the site
* @return string
*/
private function formatDashboard()
{
if(sizeof($this->dashboard['activity']) > 0)
{
for($i =0; $i < sizeof($this->dashboard['activity']['value']); $i++)
{
if( is_float($this->dashboard['activity']['value'][$i]))
$this->dashboard['activity']['value'][$i] = number_format($this->dashboard['activity']['value'][$i],2);
else
$this->dashboard['activity']['value'][$i] = (int)($this->dashboard['activity']['value'][$i]);
}
}
if(sizeof($this->dashboard['activity_day']) > 0)
{
foreach($this->dashboard['activity_day'] as $key => $value)
{
if(is_array($value) && sizeof($value) > 0)
{
foreach($value as $k => $v)
{
if(is_float($v))
{
$this->dashboard['activity_day'][$key][$k] = number_format($v, 2);
}
else
$v = (int)($v);
}
}
}
}
if(sizeof($this->dashboard['activity_edited']) > 0)
{
for($i =0; $i < sizeof($this->dashboard['activity_edited']['value']); $i++)
{
if($this->dashboard['activity_edited']['value'][$i] < 1 && $this->dashboard['activity_edited']['value'][$i] != 0)
$this->dashboard['activity_edited']['value'][$i] = number_format($this->dashboard['activity_edited']['value'][$i], 2);
else
$this->dashboard['activity_edited']['value'][$i] = (int)($this->dashboard['activity_edited']['value'][$i]);
}
}
if(sizeof($this->dashboard['activity_added']) > 0)
{
for($i =0; $i < sizeof($this->dashboard['activity_added']['value']); $i++)
{
if($this->dashboard['activity_added']['value'][$i] < 1 && $this->dashboard['activity_added']['value'][$i] != 0)
$this->dashboard['activity_added']['value'][$i] = number_format($this->dashboard['activity_added']['value'][$i], 2);
else
$this->dashboard['activity_added']['value'][$i] = (int)($this->dashboard['activity_added']['value'][$i]);
}
}
}
}