365 lines
12 KiB
PHP
365 lines
12 KiB
PHP
<?php
|
|
/*+**********************************************************************************
|
|
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
|
|
* ("License"); You may not use this file except in compliance with the License
|
|
* The Original Code is: vtiger CRM Open Source
|
|
* The Initial Developer of the Original Code is vtiger.
|
|
* Portions created by vtiger are Copyright (C) vtiger.
|
|
* All Rights Reserved.
|
|
************************************************************************************/
|
|
include_once 'vtlib/Vtiger/Event.php';
|
|
include_once 'include/Webservices/GetUpdates.php';
|
|
|
|
class ModTracker {
|
|
|
|
|
|
/**
|
|
* Constant variables which indicates the status of the changed record.
|
|
*/
|
|
public static $UPDATED = '0';
|
|
public static $DELETED = '1';
|
|
public static $CREATED = '2';
|
|
|
|
/* Entry point will invoke this function no need to act on */
|
|
function track_view($user_id, $current_module,$id='') {}
|
|
|
|
/**
|
|
* Invoked when special actions are performed on the module.
|
|
* @param String Module name
|
|
* @param String Event Type
|
|
*/
|
|
function vtlib_handler($moduleName, $eventType) {
|
|
global $adb, $currentModule;
|
|
|
|
$modtrackerModule = Vtiger_Module::getInstance($currentModule);
|
|
$otherModuleNames = $this->getModTrackerEnabledModules();
|
|
|
|
if($eventType == 'module.postinstall') {
|
|
$adb->pquery('UPDATE vtiger_tab SET customized=0 WHERE name=?', array($moduleName));
|
|
|
|
$fieldid = $adb->getUniqueID('vtiger_settings_field');
|
|
$blockid = getSettingsBlockId('LBL_OTHER_SETTINGS');
|
|
$seq_res = $adb->pquery("SELECT max(sequence) AS max_seq FROM vtiger_settings_field WHERE blockid = ?", array($blockid));
|
|
if ($adb->num_rows($seq_res) > 0) {
|
|
$cur_seq = $adb->query_result($seq_res, 0, 'max_seq');
|
|
if ($cur_seq != null) $seq = $cur_seq + 1;
|
|
}
|
|
|
|
$adb->pquery('INSERT INTO vtiger_settings_field(fieldid, blockid, name, iconpath, description, linkto, sequence)
|
|
VALUES (?,?,?,?,?,?,?)', array($fieldid, $blockid, 'ModTracker', 'set-IcoLoginHistory.gif', 'LBL_MODTRACKER_DESCRIPTION',
|
|
'index.php?module=ModTracker&action=BasicSettings&parenttab=Settings&formodule=ModTracker', $seq));
|
|
|
|
} else if($eventType == 'module.disabled') {
|
|
|
|
$em = new VTEventsManager($adb);
|
|
$em->setHandlerInActive('ModTrackerHandler');
|
|
|
|
// De-register Common Javascript
|
|
$modtrackerModule->deleteLink( 'HEADERSCRIPT', 'ModTrackerCommon_JS');
|
|
|
|
} else if($eventType == 'module.enabled') {
|
|
$em = new VTEventsManager($adb);
|
|
$em->setHandlerActive('ModTrackerHandler');
|
|
|
|
// Register Common Javascript
|
|
$modtrackerModule->addLink( 'HEADERSCRIPT', 'ModTrackerCommon_JS', 'modules/ModTracker/ModTrackerCommon.js');
|
|
|
|
} else if($eventType == 'module.preuninstall') {
|
|
// TODO Handle actions when this module is about to be deleted.
|
|
} else if($eventType == 'module.preupdate') {
|
|
// TODO Handle actions before this module is updated.
|
|
} else if($eventType == 'module.postupdate') {
|
|
// TODO Handle actions after this module is updated.
|
|
}
|
|
}
|
|
|
|
/**
|
|
* function gives an array of module names for which modtracking is enabled
|
|
*/
|
|
function getModTrackerEnabledModules() {
|
|
global $adb;
|
|
$moduleResult = $adb->pquery('SELECT * FROM vtiger_modtracker_tabs', array());
|
|
for($i=0; $i<$adb->num_rows($moduleResult); $i++) {
|
|
$tabId = $adb->query_result($moduleResult, $i, 'tabid');
|
|
$visible = $adb->query_result($moduleResult, $i, 'visible');
|
|
self::updateCache($tabId, $visible);
|
|
if($visible == 1) {
|
|
$modules[] = getTabModuleName($tabId);
|
|
}
|
|
}
|
|
return $modules;
|
|
}
|
|
|
|
// cache variable
|
|
static $__cache_modtracker = array();
|
|
|
|
/**
|
|
*Invoked to disable tracking for the module.
|
|
* @param Integer $tabid
|
|
*/
|
|
static function disableTrackingForModule($tabid){
|
|
global $adb;
|
|
if(!self::isModulePresent($tabid)){
|
|
$res=$adb->pquery("INSERT INTO vtiger_modtracker_tabs VALUES(?,?)",array($tabid,0));
|
|
self::updateCache($tabid,0);
|
|
} else{
|
|
$updatevisibility = $adb->pquery("UPDATE vtiger_modtracker_tabs SET visible = 0 WHERE tabid = ?", array($tabid));
|
|
self::updateCache($tabid,0);
|
|
}
|
|
if(self::isModtrackerLinkPresent($tabid)) {
|
|
$moduleInstance=Vtiger_Module::getInstance($tabid);
|
|
$moduleInstance->deleteLink('DETAILVIEWBASIC', 'View History');
|
|
}
|
|
}
|
|
|
|
/**
|
|
*Invoked to enable tracking for the module.
|
|
* @param Integer $tabid
|
|
*/
|
|
static function enableTrackingForModule($tabid){
|
|
global $adb;
|
|
if(!self::isModulePresent($tabid)){
|
|
$res=$adb->pquery("INSERT INTO vtiger_modtracker_tabs VALUES(?,?)",array($tabid,1));
|
|
self::updateCache($tabid,1);
|
|
} else{
|
|
$updatevisibility = $adb->pquery("UPDATE vtiger_modtracker_tabs SET visible = 1 WHERE tabid = ?", array($tabid));
|
|
self::updateCache($tabid,1);
|
|
}
|
|
if(!self::isModTrackerLinkPresent($tabid)){
|
|
$moduleInstance=Vtiger_Module::getInstance($tabid);
|
|
$moduleInstance->addLink('DETAILVIEWBASIC', 'View History', "javascript:ModTrackerCommon.showhistory('\$RECORD\$')",'','',
|
|
array('path'=>'modules/ModTracker/ModTracker.php','class'=>'ModTracker','method'=>'isViewPermitted'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
*Invoked to check if tracking is enabled or disabled for the module.
|
|
* @param String $modulename
|
|
*/
|
|
static function isTrackingEnabledForModule($modulename){
|
|
global $adb;
|
|
$tabid = getTabid($modulename);
|
|
if(!self::getVisibilityForModule($tabid)) {
|
|
$query = $adb->pquery("SELECT * FROM vtiger_modtracker_tabs WHERE vtiger_modtracker_tabs.visible = 1
|
|
AND vtiger_modtracker_tabs.tabid=?", array($tabid));
|
|
$rows = $adb->num_rows($query);
|
|
$tabid=$adb->query_result($query,0,'tabid');
|
|
$visible=$adb->query_result($query,0,'visible');
|
|
if($rows<1){
|
|
self::updateCache($tabid,$visible);
|
|
return false;
|
|
} else{
|
|
self::updateCache($tabid,$visible);
|
|
return true;
|
|
}
|
|
} else
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
*Invoked to check if the module is present in the table or not.
|
|
* @param Integer $tabid
|
|
*/
|
|
static function isModulePresent($tabid){
|
|
global $adb;
|
|
if(!self::checkModuleInModTrackerCache($tabid)){
|
|
$query=$adb->pquery("SELECT * FROM vtiger_modtracker_tabs WHERE tabid = ?",array($tabid));
|
|
$rows = $adb->num_rows($query);
|
|
if($rows){
|
|
$tabid=$adb->query_result($query,0,'tabid');
|
|
$visible=$adb->query_result($query,0,'visible');
|
|
self::updateCache($tabid,$visible);
|
|
return true;
|
|
} else
|
|
return false;
|
|
} else
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
*Invoked to check if ModTracker links are enabled for the module.
|
|
* @param Integer $tabid
|
|
*/
|
|
static function isModtrackerLinkPresent($tabid){
|
|
global $adb;
|
|
$query1=$adb->pquery("SELECT * FROM vtiger_links WHERE linktype='DETAILVIEWBASIC' AND
|
|
linklabel = 'View History' AND tabid = ?",array($tabid));
|
|
$row=$adb->num_rows($query1);
|
|
if($row>=1)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
*Invoked to update cache.
|
|
* @param Integer $tabid
|
|
* @param Boolean $visible
|
|
*/
|
|
static function updateCache($tabid,$visible){
|
|
self::$__cache_modtracker[$tabid] = array(
|
|
'tabid' => $tabid,
|
|
'visible' => $visible
|
|
);
|
|
}
|
|
|
|
/**
|
|
*Invoked to check the ModTracker cache.
|
|
* @param Integer $tabid
|
|
*/
|
|
static function checkModuleInModTrackerCache($tabid){
|
|
if(isset(self::$__cache_modtracker[$tabid])) {
|
|
return true;
|
|
} else
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
*Invoked to fetch the visibility for the module from the cache.
|
|
* @param Integer $tabid
|
|
*/
|
|
static function getVisibilityForModule($tabid){
|
|
for($i=0;$i<count(self::$__cache_modtracker);$i++) {
|
|
if(isset(self::$__cache_modtracker[$tabid])) {
|
|
return $__cache_modtracker[$i]['visible'];
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Get the list of changed record after $mtime
|
|
* @param <type> $mtime
|
|
* @param <type> $user
|
|
* @param <type> $limit
|
|
*/
|
|
function getChangedRecords($uniqueId, $mtime, $limit = 100) {
|
|
global $current_user, $adb;
|
|
$datetime = date('Y-m-d H:i:s', $mtime);
|
|
|
|
$accessibleModules = $this->getModTrackerEnabledModules();
|
|
|
|
if(empty($accessibleModules)) throw new Exception('Modtracker not enabled for any modules');
|
|
|
|
$query = "SELECT id, module, modifiedtime, vtiger_crmentity.crmid, smownerid, vtiger_modtracker_basic.status
|
|
FROM vtiger_modtracker_basic
|
|
INNER JOIN vtiger_crmentity ON vtiger_modtracker_basic.crmid = vtiger_crmentity.crmid
|
|
AND vtiger_modtracker_basic.changedon = vtiger_crmentity.modifiedtime
|
|
WHERE id > ? AND changedon >= ? AND module IN(".generateQuestionMarks($accessibleModules).")
|
|
ORDER BY id";
|
|
|
|
$params = array($uniqueId, $datetime);
|
|
foreach($accessibleModules as $entityModule) {
|
|
$params[] = $entityModule;
|
|
}
|
|
|
|
if($limit != false)
|
|
$query .=" LIMIT $limit";
|
|
|
|
$result = $adb->pquery($query, $params);
|
|
|
|
$modTime = array();
|
|
$rows = $adb->num_rows($result);
|
|
|
|
for($i=0;$i<$rows;$i++) {
|
|
$status = $adb->query_result($result,$i,'status');
|
|
|
|
$record['uniqueid'] = $adb->query_result($result,$i,'id');
|
|
$record['modifiedtime'] = $adb->query_result($result,$i,'modifiedtime');
|
|
$record['module'] = $adb->query_result($result,$i,'module');
|
|
$record['crmid'] = $adb->query_result($result,$i,'crmid');
|
|
$record['assigneduserid'] = $adb->query_result($result,$i,'smownerid');
|
|
|
|
if($status == ModTracker::$DELETED) {
|
|
$deletedRecords[] = $record;
|
|
} elseif($status == ModTracker::$CREATED) {
|
|
$createdRecords[] = $record;
|
|
} elseif($status == ModTracker::$UPDATED) {
|
|
$updatedRecords[] = $record;
|
|
}
|
|
|
|
$modTime[] = $record['modifiedtime'];
|
|
$uniqueIds[] = $record['uniqueid'];
|
|
}
|
|
|
|
if(!empty($uniqueIds))
|
|
$maxUniqueId = max($uniqueIds);
|
|
|
|
if(empty($maxUniqueId)) {
|
|
$maxUniqueId = $uniqueId;
|
|
}
|
|
|
|
if(!empty($modTime)) {
|
|
$maxModifiedTime = max($modTime);
|
|
}
|
|
if(!$maxModifiedTime) {
|
|
$maxModifiedTime = $datetime;
|
|
}
|
|
|
|
$output['created'] = $createdRecords;
|
|
$output['updated'] = $updatedRecords;
|
|
$output['deleted'] = $deletedRecords;
|
|
|
|
$moreQuery = "SELECT * FROM vtiger_modtracker_basic WHERE id > ? AND changedon >= ? AND module
|
|
IN(".generateQuestionMarks($accessibleModules).")";
|
|
|
|
$param = array($maxUniqueId, $maxModifiedTime);
|
|
foreach($accessibleModules as $entityModule) {
|
|
$param[] = $entityModule;
|
|
}
|
|
|
|
$result = $adb->pquery($moreQuery, $param);
|
|
|
|
if($adb->num_rows($result)>0) {
|
|
$output['more'] = true;
|
|
} else {
|
|
$output['more'] = false;
|
|
}
|
|
|
|
$output['uniqueid'] = $maxUniqueId;
|
|
|
|
if(!$maxModifiedTime) {
|
|
$modifiedtime = $mtime;
|
|
} else {
|
|
$modifiedtime = vtws_getSeconds($maxModifiedTime);
|
|
}
|
|
if(is_string($modifiedtime)) {
|
|
$modifiedtime = intval($modifiedtime);
|
|
}
|
|
$output['lastModifiedTime'] = $modifiedtime;
|
|
|
|
return $output;
|
|
}
|
|
|
|
|
|
static function getRecordFieldChanges($crmid, $time) {
|
|
global $adb;
|
|
|
|
$date = date('Y-m-d H:i:s', $time);
|
|
|
|
$fieldResult = $adb->pquery('SELECT * FROM vtiger_modtracker_detail
|
|
INNER JOIN vtiger_modtracker_basic ON vtiger_modtracker_basic.id = vtiger_modtracker_detail.id
|
|
WHERE crmid = ? AND changedon >= ?', array($crmid, $date));
|
|
for($i=0; $i<$adb->num_rows($fieldResult); $i++) {
|
|
$fieldName = $adb->query_result($fieldResult, $i, 'fieldname');
|
|
if($fieldName == 'record_id' || $fieldName == 'record_module' ||
|
|
$fieldName == 'createdtime') continue;
|
|
|
|
$field['postvalue'] = $adb->query_result($fieldResult, $i, 'postvalue');
|
|
$field['prevalue'] = $adb->query_result($fieldResult, $i, 'prevalue');
|
|
$fields[$fieldName] = $field;
|
|
}
|
|
return $fields;
|
|
}
|
|
|
|
static function isViewPermitted($linkData) {
|
|
$moduleName = $linkData->getModule();
|
|
$recordId = $linkData->getInputParameter('record');
|
|
if(isPermitted($moduleName, 'DetailView', $recordId) == 'yes') {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
?>
|