Files
crm.clientright.ru/modules/Vtiger/models2/DashBoard.php
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- Added comprehensive AI Assistant system (aiassist/ directory):
  * Vector search and embedding capabilities
  * Typebot proxy integration
  * Elastic search functionality
  * Message classification and chat history
  * MCP proxy for external integrations

- Implemented Court Status API (GetCourtStatus.php):
  * Real-time court document status checking
  * Integration with external court systems
  * Comprehensive error handling and logging

- Enhanced S3 integration:
  * Improved file backup system with metadata
  * Batch processing capabilities
  * Enhanced error logging and recovery
  * Copy operations with URL fixing

- Added Telegram contact creation API
- Improved error logging across all modules
- Enhanced callback system for AI responses
- Extensive backup file storage with timestamps
- Updated documentation and README files

- File storage improvements:
  * Thousands of backup files with proper metadata
  * Fix operations for broken file references
  * Project-specific backup and recovery systems
  * Comprehensive file integrity checking

Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
2025-10-16 11:17:21 +03:00

416 lines
15 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 Vtiger_DashBoard_Model extends Vtiger_Base_Model {
var $dashboardTabLimit = 10;
/**
* Function to get Module instance
* @return <Vtiger_Module_Model>
*/
public function getModule() {
return $this->module;
}
/**
* Function to set the module instance
* @param <Vtiger_Module_Model> $moduleInstance - module model
* @return Vtiger_DetailView_Model>
*/
public function setModule($moduleInstance) {
$this->module = $moduleInstance;
return $this;
}
/**
* Function to get the module name
* @return <String> - name of the module
*/
public function getModuleName(){
return $this->getModule()->get('name');
}
/**
* Function returns the list of Widgets
* @return <Array of Vtiger_Widget_Model>
*/
public function getSelectableDashboard() {
$db = PearDatabase::getInstance();
$currentUser = Users_Record_Model::getCurrentUserModel();
$currentUserPrivilegeModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
$moduleModel = $this->getModule();
$dashBoardTabId = $this->get('tabid');
$dashBoardTabInfo = $this->getTabInfo($dashBoardTabId);
$moduleTabIdList = array($moduleModel->getId());
if(!empty($dashBoardTabInfo['appname'])) {
$allVisibleModules = Settings_MenuEditor_Module_Model::getAllVisibleModules();
$appVisibleModules = $allVisibleModules[$dashBoardTabInfo['appname']];
if(is_array($appVisibleModules)) {
$moduleTabIdList = array();
foreach($appVisibleModules as $moduleInstance) {
$moduleTabIdList[] = $moduleInstance->getId();
}
}
}
$sql = 'SELECT * FROM vtiger_links WHERE linktype = ? AND tabid IN ('. generateQuestionMarks($moduleTabIdList) .') AND linkid NOT IN (SELECT linkid FROM vtiger_module_dashboard_widgets WHERE userid = ? and dashboardtabid=? )';
$params = array('DASHBOARDWIDGET');
$params = array_merge($params, $moduleTabIdList);
$params = array_merge($params, array($currentUser->getId(), $dashBoardTabId));
$sql .= ' UNION SELECT * FROM vtiger_links WHERE linklabel in (?,?)';
$params[] = 'Mini List';
$params[] = 'Notebook';
$result = $db->pquery($sql, $params);
$widgets = array();
for($i=0; $i<$db->num_rows($result); $i++) {
$row = $db->query_result_rowdata($result, $i);
if($row['linklabel'] == 'Tag Cloud') {
$isTagCloudExists = getTagCloudView($currentUser->getId());
if($isTagCloudExists == 'false') {
continue;
}
}
if($this->checkModulePermission($row)) {
$widgets[] = Vtiger_Widget_Model::getInstanceFromValues($row);
}
}
return $widgets;
}
//SalesPlatform.ru begin
/**
* Retrurns selectable detail view widgets
* @param type $moduleName
*/
public function getSelectableDetailDashboards($moduleName, $recordId) {
$dashboardsUrls = array();
foreach (Reports_Module_Model::getTemplatesReportModels($moduleName) as $report) {
$dashboardsUrls[] = $report->getWidgetReportURL();
}
$detailSelectableWidgets = array();
if(!empty($dashboardsUrls)) {
$inCriteria = '(' . substr(str_repeat('?,', count($dashboardsUrls)), 0, -1) . ')';
$sql = 'SELECT * FROM vtiger_links WHERE linktype=?' .
'AND tabid=? AND linkid NOT IN (SELECT linkid FROM vtiger_module_dashboard_widgets
WHERE userid=?) AND linkurl IN' . $inCriteria;
$db = PearDatabase::getInstance();
$currentUser = Users_Record_Model::getCurrentUserModel();
$result = $db->pquery($sql, array_merge(
array('DASHBOARDWIDGET', getTabid($moduleName), $currentUser->getId()),
$dashboardsUrls
));
while($row = $db->fetchByAssoc($result)) {
/* Prepare URL for report template */
$widgetModel = Vtiger_Widget_Model::getInstanceFromValues($row);
$widgetModel->applyTemplateRecordId($recordId);
$detailSelectableWidgets[] = $widgetModel;
}
}
return $detailSelectableWidgets;
}
public function getDetailDashboards($moduleName, $recordId) {
$dashboardsUrls = array();
foreach (Reports_Module_Model::getTemplatesReportModels($moduleName) as $report) {
$dashboardsUrls[] = $report->getWidgetReportURL();
}
$detailWidgets = array();
if(!empty($dashboardsUrls)) {
$inCriteria = '(' . substr(str_repeat('?,', count($dashboardsUrls)), 0, -1) . ')';
$sql = "SELECT vtiger_links.*, vtiger_module_dashboard_widgets.userid, vtiger_module_dashboard_widgets.id as widgetid, vtiger_module_dashboard_widgets.position as position, vtiger_links.linkid FROM vtiger_links " .
"INNER JOIN vtiger_module_dashboard_widgets ON vtiger_links.linkid=vtiger_module_dashboard_widgets.linkid ".
"WHERE (linktype=? AND tabid=? AND vtiger_module_dashboard_widgets.userid=? AND linkurl IN" . $inCriteria . ")";
$db = PearDatabase::getInstance();
$currentUser = Users_Record_Model::getCurrentUserModel();
$result = $db->pquery($sql, array_merge(
array('DASHBOARDWIDGET', getTabid($moduleName), $currentUser->getId()),
$dashboardsUrls
));
while($row = $db->fetchByAssoc($result)) {
/* Prepare URL for report template */
if($this->checkModulePermission($row)) {
$widgetModel = Vtiger_Widget_Model::getInstanceFromValues($row);
$widgetModel->applyTemplateRecordId($recordId);
$detailWidgets[] = $widgetModel;
}
}
}
return $detailWidgets;
}
//SalesPlatform.ru end
/**
* Function returns List of User's selected Dashboard Widgets
* @return <Array of Vtiger_Widget_Model>
*/
public function getDashboards($moduleDashboard) {
$db = PearDatabase::getInstance();
$currentUser = Users_Record_Model::getCurrentUserModel();
$currentUserPrivilegeModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
$moduleModel = $this->getModule();
$sql = "SELECT vtiger_links.*, vtiger_module_dashboard_widgets.userid, vtiger_module_dashboard_widgets.filterid, vtiger_module_dashboard_widgets.data, vtiger_module_dashboard_widgets.id as widgetid, vtiger_module_dashboard_widgets.position as position, vtiger_module_dashboard_widgets.size as size, vtiger_links.linkid as id FROM vtiger_links ".
" INNER JOIN vtiger_module_dashboard_widgets ON vtiger_links.linkid=vtiger_module_dashboard_widgets.linkid".
" WHERE vtiger_module_dashboard_widgets.userid = ? AND linktype = ? AND tabid = ?";
$params = array($currentUser->getId(), 'DASHBOARDWIDGET', $moduleModel->getId());
// Added for Vtiger7
if($this->get("tabid")){
$sql .= " AND dashboardtabid = ?";
array_push($params, $this->get("tabid"));
}
$result = $db->pquery($sql, $params);
$widgets = array();
for($i=0, $len=$db->num_rows($result); $i<$len; $i++) {
$row = $db->query_result_rowdata($result, $i);
$data = json_decode(decode_html($row['data']), true);
$sourceModule = $data['module'];
if(!empty($sourceModule) && !vtlib_isModuleActive($sourceModule)) {
continue;
}
$row['linkid'] = $row['id'];
if($this->checkModulePermission($row)) {
$widgets[] = Vtiger_Widget_Model::getInstanceFromValues($row);
}
}
foreach ($widgets as $index => $widget) {
$label = $widget->get('linklabel');
if($label == 'Tag Cloud') {
$isTagCloudExists = getTagCloudView($currentUser->getId());
if($isTagCloudExists === 'false') unset($widgets[$index]);
}
}
//For chart reports as widgets
$sql = "SELECT reportid FROM vtiger_module_dashboard_widgets WHERE userid = ? AND linkid= ? AND reportid IS NOT NULL";
$params = array($currentUser->getId(),0);
// Added for Vtiger7
if($this->get("tabid")){
$sql .= " AND dashboardtabid = ?";
array_push($params, $this->get("tabid"));
}
$result = $db->pquery($sql, $params);
for($i=0, $len=$db->num_rows($result); $i<$len; $i++) {
$row = $db->query_result_rowdata($result, $i);
$chartReportModel = Reports_Record_Model::getInstanceById($row['reportid']);
if($moduleDashboard == 'Home' || $moduleDashboard == $chartReportModel->getPrimaryModule()){
$tabId = getTabid($chartReportModel->getPrimaryModule());
if($tabId && $currentUserPrivilegeModel->hasModulePermission($tabId)) {
$widgets[] = Vtiger_Widget_Model::getInstanceWithReportId($row['reportid'], $currentUser->getId());
}
}
}
return $widgets;
}
public function getActiveTabs() {
$currentUserPrivilagesModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
$appTabs = array('MARKETING','SALES','INVENTORY','SUPPORT','PROJECT');
$db = PearDatabase::getInstance();
$currentUser = Users_Record_Model::getCurrentUserModel();
$query = "SELECT id,tabname,sequence,isdefault,appname,modulename FROM vtiger_dashboard_tabs WHERE userid=? ORDER BY sequence ASC ";
$result = $db->pquery($query, array($currentUser->getId()));
$tabs = array();
$num_rows = $db->num_rows($result);
for($i=0;$i<$num_rows;$i++){
$row = $db->fetchByAssoc($result,$i);
$tabName = $row['tabname'];
$appName = $row['appname'];
$moduleName = $row['modulename'];
if(in_array($tabName, $appTabs)) {
$tabName = vtranslate("LBL_$tabName");
}
$tabs[$i] = array("id"=>$row["id"],"tabname"=>$tabName,"sequence"=>$row["sequence"],"isdefault"=>$row["isdefault"],'appname' => $row['appname']);
}
return $tabs;
}
/**
* To get first tab of the user
* Purpose : If user added a widget in Vtiger6 then we need add that widget for first tab
* @param type $userId
* @return type
*/
public function getUserDefaultTab($userId){
$db = PearDatabase::getInstance();
$query = "SELECT id,tabname,sequence,isdefault FROM vtiger_dashboard_tabs WHERE userid=? AND isdefault =?";
$result = $db->pquery($query, array($userId,1));
$row = $db->fetchByAssoc($result,0);
$tab = array("id"=>$row["id"],"tabname"=>$row["tabname"],"sequence"=>$row["sequence"],"isdefault"=>$row["isdefault"]);
return $tab;
}
public function addTab($tabName){
$db = PearDatabase::getInstance();
$currentUser = Users_Record_Model::getCurrentUserModel();
$result = $db->pquery("SELECT MAX(sequence)+1 AS sequence FROM vtiger_dashboard_tabs",array());
$sequence = $db->query_result($result, 0,'sequence');
$query = "INSERT INTO vtiger_dashboard_tabs(tabname, userid,sequence) VALUES(?,?,?)";
$db->pquery($query,array($tabName,$currentUser->getId(),$sequence));
$tabData = array("tabid"=>$db->getLastInsertID(),"tabname"=>$tabName,"sequence"=>$sequence);
return $tabData;
}
public function deleteTab($tabId) {
$db = PearDatabase::getInstance();
$query = "DELETE FROM vtiger_dashboard_tabs WHERE id=?";
$db->pquery($query, array($tabId));
return true;
}
public function renameTab($tabId, $tabName) {
$db = PearDatabase::getInstance();
$query = "UPDATE vtiger_dashboard_tabs SET tabname=? WHERE id=?";
$db->pquery($query, array($tabName, $tabId));
return true;
}
public function checkTabExist($tabName) {
$db = PearDatabase::getInstance();
$currentUser = Users_Record_Model::getCurrentUserModel();
$query = "SELECT * FROM vtiger_dashboard_tabs WHERE tabname=? and userid=?";
$result = $db->pquery($query, array($tabName, $currentUser->getId()));
$numRows = $db->num_rows($result);
if ($numRows > 0) {
return true;
}
return false;
}
public function checkTabsLimitExceeded() {
$db = PearDatabase::getInstance();
$currentUser = Users_Record_Model::getCurrentUserModel();
$query = "SELECT count(*) AS count FROM vtiger_dashboard_tabs WHERE userid=?";
$result = $db->pquery($query, array($currentUser->getId()));
$count = $db->query_result($result, 0, 'count');
if ($count >= $this->dashboardTabLimit) {
return true;
}
return false;
}
public function updateTabSequence($sequence){
$db = PearDatabase::getInstance();
$query = "UPDATE vtiger_dashboard_tabs SET sequence = ? WHERE id=?";
foreach($sequence as $tabId => $seq){
$db->pquery($query, array($seq,$tabId));
}
return true;
}
public function getTabInfo($tabId) {
$db = PearDatabase::getInstance();
$query = "SELECT * FROM vtiger_dashboard_tabs WHERE id=? ";
$params = array($tabId);
$result = $db->pquery($query, $params);
if ($db->num_rows($result) <= 0) {
return false;
} else {
return $db->fetchByAssoc($result, 0);
}
}
/**
* Function to get the default widgets(Deprecated)
* @return <Array of Vtiger_Widget_Model>
*/
public function getDefaultWidgets() {
//TODO: Need to review this API is needed?
$moduleModel = $this->getModule();
$widgets = array();
return $widgets;
}
/**
* Function to get the instance
* @param <String> $moduleName - module name
* @return <Vtiger_DashBoard_Model>
*/
public static function getInstance($moduleName) {
$modelClassName = Vtiger_Loader::getComponentClassName('Model', 'DashBoard', $moduleName);
$instance = new $modelClassName();
$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
return $instance->setModule($moduleModel);
}
/**
* Function to get the module and check if the module has permission from the query data
* @param <array> $resultData - Result Data From Query
* @return <boolean>
*/
public function checkModulePermission($resultData) {
$currentUserPrivilegeModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
$linkUrl = $resultData['linkurl'];
$linkLabel = $resultData['linklabel'];
$filterId = $resultData['filterid'];
$data = decode_html($resultData['data']);
$module = $this->getModuleNameFromLink($linkUrl, $linkLabel);
if($module == 'Home' && !empty($filterId) && !empty($data)) {
$filterData = Zend_Json::decode($data);
$module = $filterData['module'];
}
return ($currentUserPrivilegeModel->hasModulePermission(getTabid($module)) && !Vtiger_Runtime::isRestricted('modules', $module));
}
/**
* Function to get the module name of a widget using linkurl
* @param <string> $linkUrl
* @param <string> $linkLabel
* @return <string> $module - Module Name
*/
public function getModuleNameFromLink($linkUrl, $linkLabel) {
$urlParts = parse_url($linkUrl);
parse_str($urlParts['query'], $params);
$module = $params['module'];
if($linkLabel == 'Overdue Activities' || $linkLabel == 'Upcoming Activities') {
$module = 'Calendar';
}
return $module;
}
}