305 lines
11 KiB
PHP
305 lines
11 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.
|
||
|
|
*************************************************************************************/
|
||
|
|
|
||
|
|
class Home_Module_Model extends Vtiger_Module_Model {
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Function returns the default view for the Home module
|
||
|
|
* @return <String>
|
||
|
|
*/
|
||
|
|
public function getDefaultViewName() {
|
||
|
|
return 'DashBoard';
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Function returns latest comments across CRM
|
||
|
|
* @param <Vtiger_Paging_Model> $pagingModel
|
||
|
|
* @return <Array>
|
||
|
|
*/
|
||
|
|
public function getComments($pagingModel, $user, $dateFilter='') {
|
||
|
|
$db = PearDatabase::getInstance();
|
||
|
|
|
||
|
|
$sql = 'SELECT vtiger_modcomments.*,vtiger_crmentity.setype AS setype,vtiger_crmentity.createdtime AS createdtime, vtiger_crmentity.smownerid AS smownerid,
|
||
|
|
crmentity2.crmid AS parentId, crmentity2.setype AS parentModule FROM vtiger_modcomments
|
||
|
|
INNER JOIN vtiger_crmentity ON vtiger_modcomments.modcommentsid = vtiger_crmentity.crmid
|
||
|
|
AND vtiger_crmentity.deleted = 0
|
||
|
|
INNER JOIN vtiger_crmentity crmentity2 ON vtiger_modcomments.related_to = crmentity2.crmid
|
||
|
|
AND crmentity2.deleted = 0
|
||
|
|
INNER JOIN vtiger_modtracker_basic ON vtiger_modtracker_basic.crmid = vtiger_crmentity.crmid';
|
||
|
|
|
||
|
|
$currentUser = Users_Record_Model::getCurrentUserModel();
|
||
|
|
$params = array();
|
||
|
|
|
||
|
|
if($user === 'all') {
|
||
|
|
if(!$currentUser->isAdminUser()){
|
||
|
|
$accessibleUsers = array_keys($currentUser->getAccessibleUsers());
|
||
|
|
$nonAdminAccessQuery = Users_Privileges_Model::getNonAdminAccessControlQuery('ModComments');
|
||
|
|
$sql .= $nonAdminAccessQuery;
|
||
|
|
$sql .= ' AND userid IN('. generateQuestionMarks($accessibleUsers).')';
|
||
|
|
$params = array_merge($params,$accessibleUsers);
|
||
|
|
}
|
||
|
|
}else{
|
||
|
|
$sql .= ' AND userid = ?';
|
||
|
|
$params[] = $user;
|
||
|
|
}
|
||
|
|
//handling date filter for history widget in home page
|
||
|
|
if(!empty($dateFilter)) {
|
||
|
|
$sql .= ' AND vtiger_modtracker_basic.changedon BETWEEN ? AND ? ';
|
||
|
|
$params[] = $dateFilter['start'];
|
||
|
|
$params[] = $dateFilter['end'];
|
||
|
|
}
|
||
|
|
|
||
|
|
$sql .= ' ORDER BY vtiger_crmentity.crmid DESC LIMIT ?, ?';
|
||
|
|
$params[] = $pagingModel->getStartIndex();
|
||
|
|
$params[] = $pagingModel->getPageLimit();
|
||
|
|
$result = $db->pquery($sql,$params);
|
||
|
|
|
||
|
|
$noOfRows = $db->num_rows($result);
|
||
|
|
//setting up the count of records before checking permissions in history
|
||
|
|
$pagingModel->set('historycount', $noOfRows);
|
||
|
|
$comments = array();
|
||
|
|
for($i=0; $i<$noOfRows; $i++) {
|
||
|
|
$row = $db->query_result_rowdata($result, $i);
|
||
|
|
if(Users_Privileges_Model::isPermitted($row['setype'], 'DetailView', $row['related_to'])){
|
||
|
|
$commentModel = Vtiger_Record_Model::getCleanInstance('ModComments');
|
||
|
|
$commentModel->setData($row);
|
||
|
|
$commentModel->set('commentcontent', $commentModel->getParsedContent());
|
||
|
|
$comments[] = $commentModel;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return $comments;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Function returns comments and recent activities across CRM
|
||
|
|
* @param <Vtiger_Paging_Model> $pagingModel
|
||
|
|
* @param <String> $type - comments, updates or all
|
||
|
|
* @return <Array>
|
||
|
|
*/
|
||
|
|
public function getHistory($pagingModel, $type='', $userId='', $dateFilter='') {
|
||
|
|
if(!$userId) $userId = 'all';
|
||
|
|
if(!$type) $type = 'all';
|
||
|
|
//TODO: need to handle security
|
||
|
|
$comments = array();
|
||
|
|
if($type == 'all' || $type == 'comments') {
|
||
|
|
$modCommentsModel = Vtiger_Module_Model::getInstance('ModComments');
|
||
|
|
if($modCommentsModel->isPermitted('DetailView')){
|
||
|
|
$comments = $this->getComments($pagingModel, $userId, $dateFilter);
|
||
|
|
}
|
||
|
|
if($type == 'comments') {
|
||
|
|
return $comments;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$db = PearDatabase::getInstance();
|
||
|
|
$params = array();
|
||
|
|
$sql = 'SELECT vtiger_modtracker_basic.*
|
||
|
|
FROM vtiger_modtracker_basic
|
||
|
|
INNER JOIN vtiger_crmentity ON vtiger_modtracker_basic.crmid = vtiger_crmentity.crmid
|
||
|
|
AND module NOT IN ("ModComments","Users") ';
|
||
|
|
|
||
|
|
$currentUser = Users_Record_Model::getCurrentUserModel();
|
||
|
|
if($userId === 'all') {
|
||
|
|
if(!$currentUser->isAdminUser()) {
|
||
|
|
$accessibleUsers = array_keys($currentUser->getAccessibleUsers());
|
||
|
|
$sql .= ' AND whodid IN ('. generateQuestionMarks($accessibleUsers).')';
|
||
|
|
$params = array_merge($params, $accessibleUsers);
|
||
|
|
}
|
||
|
|
}else{
|
||
|
|
$sql .= ' AND whodid = ?';
|
||
|
|
$params[] = $userId;
|
||
|
|
}
|
||
|
|
//handling date filter for history widget in home page
|
||
|
|
if(!empty($dateFilter)) {
|
||
|
|
$sql .= ' AND vtiger_modtracker_basic.changedon BETWEEN ? AND ? ';
|
||
|
|
$params[] = $dateFilter['start'];
|
||
|
|
$params[] = $dateFilter['end'];
|
||
|
|
}
|
||
|
|
$sql .= ' ORDER BY vtiger_modtracker_basic.id DESC LIMIT ?, ?';
|
||
|
|
$params[] = $pagingModel->getStartIndex();
|
||
|
|
$params[] = $pagingModel->getPageLimit();
|
||
|
|
|
||
|
|
//As getComments api is used to get comment infomation,no need of getting
|
||
|
|
//comment information again,so avoiding from modtracker
|
||
|
|
$result = $db->pquery($sql,$params);
|
||
|
|
|
||
|
|
$activites = array();
|
||
|
|
$noOfRows = $db->num_rows($result);
|
||
|
|
//set the records count before checking permissions and unsetting it
|
||
|
|
//If updates count more than comments count, this count should consider
|
||
|
|
if($pagingModel->get('historycount') < $noOfRows) {
|
||
|
|
$pagingModel->set('historycount', $noOfRows);
|
||
|
|
}
|
||
|
|
for($i=0; $i<$noOfRows; $i++) {
|
||
|
|
$row = $db->query_result_rowdata($result, $i);
|
||
|
|
$moduleName = $row['module'];
|
||
|
|
$recordId = $row['crmid'];
|
||
|
|
if(Users_Privileges_Model::isPermitted($moduleName, 'DetailView', $recordId)){
|
||
|
|
$modTrackerRecorModel = new ModTracker_Record_Model();
|
||
|
|
$modTrackerRecorModel->setData($row)->setParent($recordId, $moduleName);
|
||
|
|
$activites[] = $modTrackerRecorModel;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
$history = array_merge($activites, $comments);
|
||
|
|
|
||
|
|
$dateTime = array();
|
||
|
|
foreach($history as $model) {
|
||
|
|
if(get_class($model) == 'ModComments_Record_Model') {
|
||
|
|
$time = $model->get('createdtime');
|
||
|
|
} else {
|
||
|
|
$time = $model->get('changedon');
|
||
|
|
}
|
||
|
|
$dateTime[] = $time;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(!empty($history)) {
|
||
|
|
array_multisort($dateTime,SORT_DESC,SORT_STRING,$history);
|
||
|
|
return $history;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Function returns the Calendar Events for the module
|
||
|
|
* @param <String> $mode - upcoming/overdue mode
|
||
|
|
* @param <Vtiger_Paging_Model> $pagingModel - $pagingModel
|
||
|
|
* @param <String> $user - all/userid
|
||
|
|
* @param <String> $recordId - record id
|
||
|
|
* @return <Array>
|
||
|
|
*/
|
||
|
|
function getCalendarActivities($mode, $pagingModel, $user,$recordId=null) {
|
||
|
|
$currentUser = Users_Record_Model::getCurrentUserModel();
|
||
|
|
$db = PearDatabase::getInstance();
|
||
|
|
|
||
|
|
if (!$user) {
|
||
|
|
$user = $currentUser->getId();
|
||
|
|
}
|
||
|
|
|
||
|
|
$nowInUserFormat = Vtiger_Datetime_UIType::getDisplayDateTimeValue(date('Y-m-d H:i:s'));
|
||
|
|
$nowInDBFormat = Vtiger_Datetime_UIType::getDBDateTimeValue($nowInUserFormat);
|
||
|
|
list($currentDate, $currentTime) = explode(' ', $nowInDBFormat);
|
||
|
|
|
||
|
|
$query = "SELECT vtiger_crmentity.crmid, vtiger_crmentity.smownerid, vtiger_crmentity.setype, vtiger_activity.* FROM vtiger_activity
|
||
|
|
INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_activity.activityid
|
||
|
|
LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid";
|
||
|
|
|
||
|
|
$query .= Users_Privileges_Model::getNonAdminAccessControlQuery('Calendar');
|
||
|
|
|
||
|
|
$query .= " WHERE vtiger_crmentity.deleted=0
|
||
|
|
AND (vtiger_activity.activitytype NOT IN ('Emails'))
|
||
|
|
AND (vtiger_activity.status is NULL OR vtiger_activity.status NOT IN ('Completed', 'Deferred', 'Cancelled'))
|
||
|
|
AND (vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus NOT IN ('Held', 'Cancelled'))";
|
||
|
|
|
||
|
|
if(!$currentUser->isAdminUser()) {
|
||
|
|
$moduleFocus = CRMEntity::getInstance('Calendar');
|
||
|
|
$condition = $moduleFocus->buildWhereClauseConditionForCalendar();
|
||
|
|
if($condition) {
|
||
|
|
$query .= ' AND '.$condition;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if ($mode === 'upcoming') {
|
||
|
|
$query .= " AND CASE WHEN vtiger_activity.activitytype='Task' THEN due_date >= '$currentDate' ELSE CONCAT(due_date,' ',time_end) >= '$nowInDBFormat' END";
|
||
|
|
} elseif ($mode === 'overdue') {
|
||
|
|
$query .= " AND CASE WHEN vtiger_activity.activitytype='Task' THEN due_date < '$currentDate' ELSE CONCAT(due_date,' ',time_end) < '$nowInDBFormat' END";
|
||
|
|
}
|
||
|
|
|
||
|
|
$params = array();
|
||
|
|
if($user != 'all' && $user != '') {
|
||
|
|
//SalesPlatform.ru begin
|
||
|
|
// if($user === $currentUser->id) {
|
||
|
|
//SalesPlatform.ru end
|
||
|
|
$query .= " AND vtiger_crmentity.smownerid = ?";
|
||
|
|
$params[] = $user;
|
||
|
|
//SalesPlatform.ru begin
|
||
|
|
//}
|
||
|
|
//SalesPlatform.ru end
|
||
|
|
}
|
||
|
|
|
||
|
|
$query .= " ORDER BY date_start, time_start LIMIT ?, ?";
|
||
|
|
$params[] = $pagingModel->getStartIndex();
|
||
|
|
$params[] = $pagingModel->getPageLimit()+1;
|
||
|
|
|
||
|
|
$result = $db->pquery($query, $params);
|
||
|
|
$numOfRows = $db->num_rows($result);
|
||
|
|
|
||
|
|
$groupsIds = Vtiger_Util_Helper::getGroupsIdsForUsers($currentUser->getId());
|
||
|
|
$activities = array();
|
||
|
|
$recordsToUnset = array();
|
||
|
|
for($i=0; $i<$numOfRows; $i++) {
|
||
|
|
$newRow = $db->query_result_rowdata($result, $i);
|
||
|
|
$model = Vtiger_Record_Model::getCleanInstance('Calendar');
|
||
|
|
$ownerId = $newRow['smownerid'];
|
||
|
|
$currentUser = Users_Record_Model::getCurrentUserModel();
|
||
|
|
$visibleFields = array('activitytype','date_start','time_start','due_date','time_end','assigned_user_id','visibility','smownerid','crmid');
|
||
|
|
$visibility = true;
|
||
|
|
if(in_array($ownerId, $groupsIds)) {
|
||
|
|
$visibility = false;
|
||
|
|
} else if($ownerId == $currentUser->getId()){
|
||
|
|
$visibility = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
//SalesPlatform.ru begin
|
||
|
|
require('user_privileges/user_privileges_'.$currentUser->id.'.php');
|
||
|
|
require('user_privileges/sharing_privileges_'.$currentUser->id.'.php');
|
||
|
|
if($profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0) {
|
||
|
|
$visibility = false;
|
||
|
|
}
|
||
|
|
//SalesPlatform.ru end
|
||
|
|
|
||
|
|
if(!$currentUser->isAdminUser() && $newRow['activitytype'] != 'Task' && $newRow['visibility'] == 'Private' && $ownerId && $visibility) {
|
||
|
|
foreach($newRow as $data => $value) {
|
||
|
|
if(in_array($data, $visibleFields) != -1) {
|
||
|
|
unset($newRow[$data]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$newRow['subject'] = vtranslate('Busy','Events').'*';
|
||
|
|
}
|
||
|
|
if($newRow['activitytype'] == 'Task') {
|
||
|
|
unset($newRow['visibility']);
|
||
|
|
|
||
|
|
$due_date = $newRow["due_date"];
|
||
|
|
$dayEndTime = "23:59:59";
|
||
|
|
$EndDateTime = Vtiger_Datetime_UIType::getDBDateTimeValue($due_date." ".$dayEndTime);
|
||
|
|
$dueDateTimeInDbFormat = explode(' ',$EndDateTime);
|
||
|
|
$dueTimeInDbFormat = $dueDateTimeInDbFormat[1];
|
||
|
|
$newRow['time_end'] = $dueTimeInDbFormat;
|
||
|
|
}
|
||
|
|
$model->setData($newRow);
|
||
|
|
$model->setId($newRow['crmid']);
|
||
|
|
$activities[$newRow['crmid']] = $model;
|
||
|
|
if(!$currentUser->isAdminUser() && $newRow['activitytype'] == 'Task' && isToDoPermittedBySharing($newRow['crmid']) == 'no') {
|
||
|
|
$recordsToUnset[] = $newRow['crmid'];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
$pagingModel->calculatePageRange($activities);
|
||
|
|
if($numOfRows > $pagingModel->getPageLimit()){
|
||
|
|
array_pop($activities);
|
||
|
|
$pagingModel->set('nextPageExists', true);
|
||
|
|
} else {
|
||
|
|
$pagingModel->set('nextPageExists', false);
|
||
|
|
}
|
||
|
|
//after setting paging model, unsetting the records which has no permissions
|
||
|
|
foreach($recordsToUnset as $record) {
|
||
|
|
unset($activities[$record]);
|
||
|
|
}
|
||
|
|
return $activities;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Function to get supported utility actions for a module
|
||
|
|
*/
|
||
|
|
function getUtilityActionsNames() {
|
||
|
|
return array();
|
||
|
|
}
|
||
|
|
}
|