Files
Phraseanet/lib/classes/module/report/nav.php
Benoît Burnichon 3464a82522 Reduce field size down to 255 utf8 characters
MySQL count 3 bytes per UTF8 character which makes the index go too large

Remove indexation of appli field which is too wide for MySQL
Remove use of appli index as was deleted
2015-04-30 16:27:26 +02:00

572 lines
18 KiB
PHP

<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2015 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Alchemy\Phrasea\Application;
class module_report_nav extends module_report
{
/**
* @desc total of record on current report
* @var string
*/
public $total_pourcent = null;
public $config = false;
public $cor_query = [
'user' => 'log.user',
'site' => 'log.site',
'societe' => 'log.societe',
'pays' => 'log.pays',
'activite' => 'log.activite',
'fonction' => 'log.fonction',
'usrid' => 'log.usrid',
'coll_id' => 'record.coll_id',
'ddate' => "log.date",
'id' => 'log_docs.id',
'log_id' => 'log_docs.log_id',
'record_id' => 'log_docs.record_id',
'final' => 'log_docs.final',
'comment' => 'log_docs.comment',
'size' => 'subdef.size'
];
/**
* constructor
*
* @param Application $app
* @param string $arg1 start date of the report
* @param string $arg2 end date of the report
* @param integer $sbas_id databox id
* @param string $collist
*/
public function __construct(Application $app, $arg1, $arg2, $sbas_id, $collist)
{
// parent::__construct($app, $arg1, $arg2, $sbas_id, $collist);
parent::__construct($app, $arg1, $arg2, $sbas_id, "");
}
private function setTotalPourcent()
{
$sqlBuilder = new module_report_sql($this->app, $this);
$filter = $sqlBuilder->getFilters();
$report_filter = $filter->getReportFilter();
$params = array_merge([], $report_filter['params']);
$sql = '
SELECT COUNT(log.id) AS total
FROM log FORCE INDEX (date_site)
WHERE ' . $report_filter['sql'] . ' AND nav != "" AND !ISNULL(usrid)';
// no_file_put_contents("/tmp/report.txt", sprintf("%s (%s)\n%s\n\n", __FILE__, __LINE__, $sql), FILE_APPEND);
$stmt = $sqlBuilder->getConnBas()->prepare($sql);
$stmt->execute($params);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt->closeCursor();
return (int) $row['total'];
}
/**
* @desc empty $champ, $result, $display, $display_value
* @return void
*/
private function initialize()
{
$this->report['legend'] = [];
$this->report['value'] = [];
$this->result = [];
$this->champ = [];
$this->default_display = [];
$this->display = [];
}
/**
* @desc report the browser used by users
* @param array $tab config for the html table
* @return tab
*/
public function buildTabNav($tab = false)
{
$i = 0;
$sqlBuilder = new module_report_sql($this->app, $this);
$filter = $sqlBuilder->getFilters();
$this->title = $this->app->trans('report:: navigateur');
$this->total_pourcent = $this->setTotalPourcent();
if (is_null($this->total_pourcent)) {
return $this->report;
}
$report_filter = $filter->getReportFilter();
$params = array_merge([], $report_filter['params']);
$sql = '
SELECT nav, SUM(1) AS nb, ROUND((SUM(1) / ' . $this->total_pourcent . ' * 100), 1) AS pourcent
FROM log FORCE INDEX (date_site, nav)
WHERE ' . $report_filter['sql'] . ' AND nav != "" AND !ISNULL(usrid)
GROUP BY nav
ORDER BY nb DESC';
// no_file_put_contents("/tmp/report.txt", sprintf("%s (%s)\n%s\n\n", __FILE__, __LINE__, $sql), FILE_APPEND);
$this->initialize();
$stmt = $sqlBuilder->getConnBas()->prepare($sql);
$stmt->execute($params);
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$this->setChamp($rs);
$this->setDisplay($tab);
foreach ($rs as $row) {
foreach ($this->champ as $key => $value) {
$this->result[$i][$value] = ($value == 'pourcent') ? $row[$value] . '%' : $row[$value];
}
$this->report['value'][] = $row['nb'];
$this->report['legend'][] = $row['nav'];
$i ++;
}
$this->total = sizeof($this->result);
$this->calculatePages();
$this->setDisplayNav();
$this->setReport();
return $this->report;
}
/**
* @desc report the OS from user
* @param array $tab config for the html table
* @return array
*/
public function buildTabOs($tab = false)
{
$sqlBuilder = new module_report_sql($this->app, $this);
$filter = $sqlBuilder->getFilters();
$i = 0;
$this->title = $this->app->trans('report:: Plateforme');
$this->total_pourcent = $this->setTotalPourcent();
if (is_null($this->total_pourcent)) {
return $this->report;
}
$report_filter = $filter->getReportFilter();
$params = array_merge([], $report_filter['params']);
$sql = '
SELECT os, COUNT(os) AS nb, ROUND((COUNT(os)/' . $this->total_pourcent . '*100),1) AS pourcent
FROM log FORCE INDEX (date_site, os)
WHERE '. $report_filter['sql'] . ' AND os != "" AND !ISNULL(usrid)
GROUP BY os
ORDER BY nb DESC';
// no_file_put_contents("/tmp/report.txt", sprintf("%s (%s)\n%s\n\n", __FILE__, __LINE__, $sql), FILE_APPEND);
$this->initialize();
$stmt = $sqlBuilder->getConnBas()->prepare($sql);
$stmt->execute($params);
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$this->setChamp($rs);
$this->setDisplay($tab);
foreach ($rs as $row) {
foreach ($this->champ as $key => $value) {
$this->result[$i][$value] = ($value == 'pourcent') ? $row[$value] . '%' : $row[$value];
}
$i ++;
$this->report['value'][] = $row['nb'];
$this->report['legend'][] = $row['os'];
}
$this->total = sizeof($this->result);
$this->calculatePages();
$this->setDisplayNav();
$this->setReport();
return $this->report;
}
/**
* @desc report the resolution that are using the users
* @param array $tab config for the html table
* @return array
*/
public function buildTabRes($tab = false)
{
$sqlBuilder = new module_report_sql($this->app, $this);
$filter = $sqlBuilder->getFilters();
$this->title = $this->app->trans('report:: resolution');
$i = 0;
$this->total_pourcent = $this->setTotalPourcent();
if (is_null($this->total_pourcent)) {
return($this->report);
}
$report_filter = $filter->getReportFilter();
$params = array_merge([], $report_filter['params']);
$sql = '
SELECT res, COUNT(res) AS nb, ROUND((COUNT(res)/ ' . $this->total_pourcent . '*100),1) AS pourcent
FROM log FORCE INDEX (date_site, res)
WHERE '. $report_filter['sql'] . ' AND res != "" AND !ISNULL(usrid)
GROUP BY res
ORDER BY nb DESC
LIMIT 0, 10';
// no_file_put_contents("/tmp/report.txt", sprintf("%s (%s)\n%s\n\n", __FILE__, __LINE__, $sql), FILE_APPEND);
$this->initialize();
$stmt = $sqlBuilder->getConnBas()->prepare($sql);
$stmt->execute($params);
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$this->setChamp($rs);
$this->setDisplay($tab);
foreach ($rs as $row) {
foreach ($this->champ as $key => $value) {
$this->result[$i][$value] = ($value == 'pourcent') ?
$row[$value] . '%' : $row[$value];
}
$i ++;
$this->report['value'][] = $row['nb'];
$this->report['legend'][] = $row['res'];
}
$this->total = sizeof($this->result);
$this->calculatePages();
$this->setDisplayNav();
$this->setReport();
return $this->report;
}
/**
* @desc report the combination (OS - Navigateur) that are using the users
* @param array $tab config for the html table
*/
public function buildTabCombo($tab = false)
{
$sqlBuilder = new module_report_sql($this->app, $this);
$filter = $sqlBuilder->getFilters();
$this->title = $this->app->trans('report:: navigateurs et plateforme');
$i = 0;
$this->total_pourcent = $this->setTotalPourcent();
if (is_null($this->total_pourcent)) {
return($this->report);
}
$report_filter = $filter->getReportFilter();
$params = array_merge([], $report_filter['params']);
$sql = "
SELECT tt.combo, COUNT( tt.combo ) AS nb, ROUND((COUNT(tt.combo)/" . $this->total_pourcent . "*100), 1) AS pourcent
FROM (
SELECT CONCAT( nav, '-', os ) AS combo
FROM log FORCE INDEX (date_site, os_nav)
WHERE ". $report_filter['sql'] ." AND nav != '' AND os != '' AND !ISNULL(usrid)
) AS tt
GROUP BY tt.combo
ORDER BY nb DESC
LIMIT 0 , 10";
// no_file_put_contents("/tmp/report.txt", sprintf("%s (%s)\n%s\n\n", __FILE__, __LINE__, $sql), FILE_APPEND);
$this->initialize();
$stmt = $sqlBuilder->getConnBas()->prepare($sql);
$stmt->execute($params);
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$this->setChamp($rs);
$this->setDisplay($tab);
foreach ($rs as $row) {
foreach ($this->champ as $key => $value) {
$this->result[$i][$value] = ($value == 'pourcent') ?
$row[$value] . '%' : $row[$value];
}
$i ++;
$this->report['value'][] = $row['nb'];
$this->report['legend'][] = $row['combo'];
}
$this->total = sizeof($this->result);
$this->calculatePages();
$this->setDisplayNav();
$this->setReport();
return $this->report;
}
/**
* @desc report the most consulted module by the users
* @param array $tab
* @return array
*/
public function buildTabModule($tab = false)
{
$this->initialize();
$sqlBuilder = new module_report_sql($this->app, $this);
$filter = $sqlBuilder->getFilters();
$this->title = $this->app->trans('report:: modules');
$x = [];
$tab_appli = [];
$this->total_pourcent = $this->setTotalPourcent();
if (is_null($this->total_pourcent)) {
return($this->report);
}
$report_filter = $filter->getReportFilter();
$params = array_merge([], $report_filter['params']);
$sql = '
SELECT appli
FROM log FORCE INDEX (date_site)
WHERE ' . $report_filter['sql'] . ' AND appli != \'a:0:{}\' AND !ISNULL(usrid)
GROUP BY appli';
// no_file_put_contents("/tmp/report.txt", sprintf("%s (%s)\n%s\n\n", __FILE__, __LINE__, $sql), FILE_APPEND);
$this->initialize();
$stmt = $sqlBuilder->getConnBas()->prepare($sql);
$stmt->execute($params);
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
foreach ($rs as $row) {
$applis = false;
if (($applis = @unserialize($row['appli'])) !== false)
array_push($x, phrasea::modulesName($this->app['translator'], $applis));
else
array_push($x, 'NULL');
}
foreach ($x as $key => $tab_value) {
if (is_array($tab_value)) {
foreach ($tab_value as $key2 => $value) {
if ( ! isset($tab_appli[$value]))
$tab_appli[$value] = 0;
$tab_appli[$value] ++;
}
}
}
$total = array_sum($tab_appli);
$this->setChamp($rs);
$this->setDisplay($tab);
foreach ($tab_appli as $appli => $nb) {
$pourcent = round(($nb / $total) * 100, 1);
foreach ($this->champ as $key => $value) {
$this->result[] = [
'appli' => $appli,
'nb' => $nb,
'pourcent' => $pourcent . '%'
];
}
$this->report['value'][] = $nb;
$this->report['legend'][] = $appli;
}
$this->total = sizeof($this->result);
$this->calculatePages();
$this->setDisplayNav();
$this->setReport();
return $this->report;
}
public function buildTabGrpInfo($req, array $params, $val, $tab = false, $on = false)
{
$this->initialize();
empty($on) ? $on = false : "";
$filter_id_apbox = $filter_id_datbox = [];
$conn = $this->app['phraseanet.appbox']->get_connection();
$this->title = $this->app->trans('report:: Information sur les utilisateurs correspondant a %critere%', ['%critere%' => $val]);
if ($on) {
if ( ! empty($req)) {
$stmt = $this->app['phraseanet.appbox']->get_databox($this->sbas_id)->get_connection()->prepare($req);
$stmt->execute($params);
$rsu = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
foreach ($rsu as $row_user) {
$filter_id_apbox[] = "usr_id = " . (int) $row_user['usrid'];
$filter_id_datbox[] = "log.usrid = " . (int) $row_user['usrid'];
}
$filter_id_apbox = implode(' OR ', $filter_id_apbox);
$filter_id_datbox = implode(' OR ', $filter_id_datbox);
}
$sql = "
SELECT
login as identifiant,
last_name as nom,
email as mail,
address AS adresse,
phone AS tel
FROM Users
WHERE $on = :value " . (('' !== $filter_id_apbox) ? "AND (" . $filter_id_apbox . ")" : '');
} else {
$sql = '
SELECT
login AS identifiant,
last_name AS nom,
email AS mail,
address AS adresse,
phone AS tel
FROM Users
WHERE (id = :value)';
}
$params2 = [':value' => $val];
$stmt = $conn->prepare($sql);
$stmt->execute($params2);
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$this->setChamp($rs);
$this->setDisplay($tab);
foreach ($rs as $row) {
foreach ($row as $fieldname => $value)
$row[$fieldname] = $value ? $value : $this->app->trans('report:: non-renseigne');
$this->result[] = $row;
}
if ($on == false) {
$login = empty($this->result[0]['identifiant']) ?
$this->app->trans('phraseanet::utilisateur inconnu') :
$this->result[0]['identifiant'];
$this->title = $this->app->trans('report:: Information sur l\'utilisateur %name%', ['%name%' => $login]);
}
$this->calculatePages();
$this->setDisplayNav();
$this->setReport();
return $this->report;
}
/**
* Return basic information about a record
*
* @param integer $bid base id
* @param integer $rid record id
* @param array $tab config for the html table
*
* @return array
*/
public function buildTabUserWhat($bid, $rid, $tab = false)
{
$this->initialize();
$sbas_id = phrasea::sbasFromBas($this->app, $bid);
try {
$record = new record_adapter($this->app, $sbas_id, $rid);
} catch (\Exception_Record_AdapterNotFound $e) {
return $this->report;
}
$this->setDisplay($tab);
$this->champ = [
'photo',
'record_id',
'date',
'type',
'titre',
'taille'
];
$document = $record->get_subdef('document');
$this->title = $this->app->trans('report:: Information sur l\'enregistrement numero %number%', ['%number%' => (int) $rid]);
$x = $record->get_thumbnail();
$this->result[] = [
'photo' =>
"<img style='width:" . $x->get_width() . "px;height:" . $x->get_height() . "px;'
src='" . (string) $x->get_url() . "'>"
, 'record_id' => $record->get_record_id()
, 'date' => $this->app['date-formatter']->getPrettyString($document->get_creation_date())
, 'type' => $document->get_mime()
, 'titre' => $record->get_title()
, 'taille' => $document->get_size()
];
$this->setDisplayNav();
$this->setReport();
return $this->report;
}
public function buildTabInfoNav($tab = false, $navigator)
{
$databox = $this->app['phraseanet.appbox']->get_databox($this->sbas_id);
$conn = $databox->get_connection();
$this->title = $this->app->trans('report:: Information sur le navigateur %name%', ['%name%' => $navigator]);
$sqlBuilder = new module_report_sql($this->app, $this);
$filter = $sqlBuilder->getFilters();
$report_filter = $filter->getReportFilter();
$params = array_merge($report_filter['params'], [':browser' => $navigator]);
$sql = "
SELECT DISTINCT(tt.version), COUNT(tt.version) as nb
FROM (
SELECT DISTINCT (log.id), version
FROM log FORCE INDEX (date_site, nav, version)
WHERE nav = :browser
AND ". $report_filter['sql'] . "
) AS tt
GROUP BY version
ORDER BY nb DESC";
// no_file_put_contents("/tmp/report.txt", sprintf("%s (%s)\n%s\n\n", __FILE__, __LINE__, $sql), FILE_APPEND);
$stmt = $conn->prepare($sql);
$stmt->execute($params);
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$this->setChamp($rs);
$this->setDisplay($tab);
$this->result = $rs;
$this->total = sizeof($this->result);
$this->calculatePages();
$this->setDisplayNav();
$this->setReport();
return $this->report;
}
}