vtenext/data/Tracker.php
2021-04-28 20:10:26 +02:00

192 lines
7.3 KiB
PHP

<?php
/*************************************
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
* SPDX-License-Identifier: AGPL-3.0-only
************************************/
// crmv@31780 - gran parte del file
include_once('config.php');
require_once('include/logging.php');
require_once('include/database/PearDatabase.php');
/** This class is used to track the recently viewed items on a per user basis.
* It is intended to be called by each module when rendering the detail form.
*/
class Tracker {
var $log;
var $db;
var $table_name;
// Tracker vte_table
var $column_fields = Array(
"id",
"user_id",
"module_name",
"item_id",
"item_summary"
);
function __construct() {
global $adb, $table_prefix;
$this->log = LoggerManager::getLogger('Tracker');
$this->table_name = $table_prefix."_tracker";
// $this->db = PearDatabase::getInstance();
$this->db = $adb;
}
/**
* Add this new item to the vte_tracker vte_table. If there are too many items (global config for now)
* then remove the oldest item. If there is more than one extra item, log an error.
* If the new item is the same as the most recent item then do not change the list
*/
function track_view($user_id, $current_module, $item_id, $item_summary) {
global $log, $adb, $table_prefix;
$this->delete_history($user_id, $item_id);
$log->info("in track view method ".$current_module);
//No genius required. Just add an if case and change the query so that it puts the tracker entry whenever you touch on the DetailView of the required entity
//get the first name and last name from the respective modules
if($current_module != '') {
$query = "select fieldname,tablename,entityidfield from ".$table_prefix."_entityname where modulename = ?";
$result = $adb->pquery($query, array($current_module));
$fieldsname = $adb->query_result($result,0,'fieldname');
$tablename = $adb->query_result($result,0,'tablename');
$entityidfield = $adb->query_result($result,0,'entityidfield');
if ((strpos($fieldsname,',') !== false)) {
// concatenate multiple fields with an whitespace between them
$fieldlists = explode(',',$fieldsname);
$fl = array();
foreach($fieldlists as $w => $c) {
if (count($fl)) {
$fl[] = "' '";
}
//crmv@24944
$wsfield = WebserviceField::fromQueryResult($adb,$adb->pquery('select * from '.$table_prefix.'_field where tabid = ? and fieldname = ?',array(getTabid($current_module),$c)),0);
$fl[] = $wsfield->getColumnName();
//crmv@24944e
}
$fieldsname = $adb->sql_concat($fl);
//crmv@24944
} else {
$wsfield = WebserviceField::fromQueryResult($adb,$adb->pquery('select * from '.$table_prefix.'_field where tabid = ? and fieldname = ?',array(getTabid($current_module),$fieldsname)),0);
$fieldsname = $wsfield->getColumnName();
}
//crmv@24944e
$query1 = "select $fieldsname as entityname from $tablename where $entityidfield = ?";
$result = $adb->pquery($query1, array($item_id));
$item_summary = $adb->query_result_no_html($result,0,'entityname'); // crmv@33097
if(strlen($item_summary) > 30) {
$item_summary = substr($item_summary,0,30).'...';
}
}
//if condition added to skip vte_faq in last viewed history
//crmv@add seq for vte_tracker
$id = $adb->getUniqueId($this->table_name);
$query = "INSERT into $this->table_name (id,user_id, module_name, item_id, item_summary) values (?,?,?,?,?)";
$qparams = array($id,$user_id, $current_module, $item_id, $item_summary);
//crmv@add seq for vte_tracker end
$this->log->info("Track Item View: ".$query);
$this->db->pquery($query, $qparams, true);
$this->prune_history($user_id);
}
/**
* param $user_id - The id of the user to retrive the history for
* param $module_name - Filter the history to only return records from the specified module. If not specified all records are returned
* return - return the array of result set rows from the query. All of the vte_table vte_fields are included
*/
function get_recently_viewed($user_id, $module_name = "") {
if (empty($user_id)) {
return;
}
global $history_max_viewed, $current_user, $table_prefix;
//crmv@36504
$query = "SELECT t.*,a.activitytype,c.crmid from $this->table_name t
inner join ".$table_prefix."_crmentity c on c.crmid=t.item_id
left join {$table_prefix}_activity a on a.activityid = c.crmid
WHERE t.user_id=? and c.deleted=0 ORDER BY id DESC";
$this->log->debug("About to retrieve list: $query");
$result = $this->db->limitpQuery($query, 0, $history_max_viewed, array($user_id));
$list = Array();
while($row = $this->db->fetchByAssoc($result, -1, false)) {
// If the module was not specified or the module matches the module of the row, add the row to the list
if ($module_name == "" || $row['module_name'] == $module_name) {
//Adding Security check
require_once('include/utils/utils.php');
require_once('include/utils/UserInfoUtil.php');
$entity_id = $row['item_id'];
$module = $row['module_name'];
$row['module_type'] = $row['module_name']; //crmv@36504
if($module == "Users") {
if(is_admin($current_user)) {
$per = 'yes';
}
} else {
//crmv@36504
if ($module == 'Calendar'){
if ($row['activitytype'] != 'Task'){
$row['module_type'] = 'Events';
}
}
//crmv@36504 e
$per = isPermitted($module,'DetailView',$entity_id);
}
if($per == 'yes') {
$list[] = $row;
}
}
}
return $list;
}
/**
* INTERNAL -- This method cleans out any entry for a record for a user.
* It is used to remove old occurances of previously viewed items.
*/
function delete_history($user_id, $item_id) {
$query = "DELETE from $this->table_name WHERE user_id=? and item_id=?";
$this->db->pquery($query, array($user_id, $item_id), true);
}
/**
* INTERNAL -- This method cleans out any entry for a record.
*/
function delete_item_history($item_id) {
$query = "DELETE from $this->table_name WHERE item_id=?";
$this->db->pquery($query, array($item_id), true);
}
/*
* INTERNAL -- This function will clean out old history records for this user if necessary.
*/
function prune_history($user_id) {
global $history_max_viewed;
$sql_limit = $history_max_viewed * 10; // keep more data in the db
$this->log->debug("About to verify history size: $query");
// get the minimum good id for the user
$query = "SELECT id from $this->table_name WHERE user_id = ? ORDER BY id DESC";
$res = $this->db->limitpQuery($query, 0, $sql_limit, array($user_id));
if ($res && $this->db->num_rows($res) > 0) {
$lastid = $this->db->query_result($res, $this->db->num_rows($res)-1, 'id');
// delete old items
$this->log->debug("About to delete oldest items:");
$query = "DELETE from $this->table_name WHERE user_id = ? AND id < ?";
$res = $this->db->pquery($query, array($user_id, $lastid));
}
}
}
?>