- 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.
248 lines
8.6 KiB
PHP
248 lines
8.6 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 RecycleBin_Module_Model extends Vtiger_Module_Model {
|
|
|
|
|
|
/**
|
|
* Function to get the url for list view of the module
|
|
* @return <string> - url
|
|
*/
|
|
public function getDefaultUrl() {
|
|
return 'index.php?module='.$this->get('name').'&view='.$this->getListViewName();
|
|
}
|
|
|
|
/**
|
|
* Function to get the list of listview links for the module
|
|
* @return <Array> - Associate array of Link Type to List of Vtiger_Link_Model instances
|
|
*/
|
|
public function getListViewLinks() {
|
|
$currentUserModel = Users_Record_Model::getCurrentUserModel();
|
|
$privileges = Users_Privileges_Model::getCurrentUserPrivilegesModel();
|
|
$basicLinks = array();
|
|
if($currentUserModel->isAdminUser()) {
|
|
$basicLinks = array(
|
|
array(
|
|
'linktype' => 'LISTVIEWBASIC',
|
|
'linklabel' => 'LBL_EMPTY_RECYCLEBIN',
|
|
'linkurl' => 'javascript:RecycleBin_List_Js.emptyRecycleBin("index.php?module='.$this->get('name').'&action=RecycleBinAjax")',
|
|
'linkicon' => ''
|
|
)
|
|
);
|
|
}
|
|
|
|
foreach($basicLinks as $basicLink) {
|
|
$links['LISTVIEWBASIC'][] = Vtiger_Link_Model::getInstanceFromValues($basicLink);
|
|
}
|
|
|
|
return $links;
|
|
}
|
|
|
|
/**
|
|
* Function to get the list of Mass actions for the module
|
|
* @param <Array> $linkParams
|
|
* @return <Array> - Associative array of Link type to List of Vtiger_Link_Model instances for Mass Actions
|
|
*/
|
|
public function getListViewMassActions() {
|
|
$currentUserModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
|
|
|
|
$massActionLinks = array();
|
|
if($currentUserModel->isAdminUser()) {
|
|
$massActionLinks[] = array(
|
|
'linktype' => 'LISTVIEWMASSACTION',
|
|
'linklabel' => 'LBL_DELETE',
|
|
'linkurl' => 'javascript:RecycleBin_List_Js.deleteRecords("index.php?module='.$this->get('name').'&action=RecycleBinAjax")',
|
|
'linkicon' => ''
|
|
);
|
|
}
|
|
|
|
$massActionLinks[] = array(
|
|
'linktype' => 'LISTVIEWMASSACTION',
|
|
'linklabel' => 'LBL_RESTORE',
|
|
'linkurl' => 'javascript:RecycleBin_List_Js.restoreRecords("index.php?module='.$this->get('name').'&action=RecycleBinAjax")',
|
|
'linkicon' => ''
|
|
);
|
|
|
|
|
|
foreach($massActionLinks as $massActionLink) {
|
|
$links[] = Vtiger_Link_Model::getInstanceFromValues($massActionLink);
|
|
}
|
|
|
|
return $links;
|
|
}
|
|
|
|
/**
|
|
* Function to get the Quick Links for the module
|
|
* @param <Array> $linkParams
|
|
* @return <Array> List of Vtiger_Link_Model instances
|
|
*/
|
|
public function getSideBarLinks($linkParams) {
|
|
$linkTypes = array('SIDEBARLINK', 'SIDEBARWIDGET');
|
|
$links = Vtiger_Link_Model::getAllByType($this->getId(), $linkTypes, $linkParams);
|
|
|
|
$quickLinks = array(
|
|
array(
|
|
'linktype' => 'SIDEBARLINK',
|
|
'linklabel' => 'LBL_RECORDS_LIST',
|
|
'linkurl' => $this->getDefaultUrl(),
|
|
'linkicon' => '',
|
|
),
|
|
);
|
|
foreach($quickLinks as $quickLink) {
|
|
$links['SIDEBARLINK'][] = Vtiger_Link_Model::getInstanceFromValues($quickLink);
|
|
}
|
|
return $links;
|
|
}
|
|
|
|
/**
|
|
* Function to get all entity modules
|
|
* @return <array>
|
|
*/
|
|
public function getAllModuleList(){
|
|
$moduleModels = parent::getEntityModules();
|
|
$restrictedModules = array('Emails', 'ProjectMilestone', 'ModComments', 'Rss', 'Portal', 'Integration', 'PBXManager', 'Dashboard', 'Home', 'Events');
|
|
foreach($moduleModels as $key => $moduleModel){
|
|
if(in_array($moduleModel->getName(),$restrictedModules) || $moduleModel->get('isentitytype') != 1){
|
|
unset($moduleModels[$key]);
|
|
}
|
|
}
|
|
return $moduleModels;
|
|
}
|
|
|
|
/**
|
|
* Function to delete the reccords perminently in vitger CRM database
|
|
*/
|
|
public function emptyRecycleBin(){
|
|
$db = PearDatabase::getInstance();
|
|
|
|
$db->pquery('DELETE vtiger_modtracker_basic.* FROM vtiger_modtracker_basic INNER JOIN vtiger_crmentity on
|
|
vtiger_crmentity.crmid = vtiger_modtracker_basic.crmid AND vtiger_crmentity.deleted = 1', array());
|
|
|
|
$getIdsQuery='SELECT crmid from vtiger_crmentity WHERE deleted=?';
|
|
$resultIds=$db->pquery($getIdsQuery,array(1));
|
|
$recordIds=array();
|
|
if($db->num_rows($resultIds)){
|
|
for($i=0;$i<$db->num_rows($resultIds);$i++){
|
|
$recordIds[$i]=$db->query_result($resultIds,$i,'crmid');
|
|
}
|
|
}
|
|
$this->deleteFiles($recordIds);
|
|
$db->pquery('DELETE FROM vtiger_crmentity WHERE deleted = 1', array());
|
|
$db->pquery('DELETE FROM vtiger_relatedlists_rb', array());
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Function to deleted the records perminently in CRM
|
|
* @param type $reocrdIds
|
|
*/
|
|
public function deleteRecords($recordIds){
|
|
$db = PearDatabase::getInstance();
|
|
|
|
$query = 'DELETE FROM vtiger_relatedlists_rb WHERE entityid in('.generateQuestionMarks($recordIds).')';
|
|
$db->pquery($query, array($recordIds));
|
|
|
|
// TODO - Remove records from module tables and other related stores.
|
|
$query = 'DELETE FROM vtiger_modtracker_basic WHERE crmid in(' . generateQuestionMarks($recordIds) . ')';
|
|
$db->pquery($query, array($recordIds));
|
|
// Delete entries of attachments from vtiger_attachments and vtiger_seattachmentsrel
|
|
$this->deleteFiles($recordIds);
|
|
|
|
//Delete the records in vtiger crmentity and relatedlists.
|
|
$query = 'DELETE FROM vtiger_crmentity WHERE deleted = ? and crmid in('.generateQuestionMarks($recordIds).')';
|
|
$db->pquery($query, array(1, $recordIds));
|
|
}
|
|
|
|
/**Function to delete files from CRM.
|
|
*@param type $recordIds
|
|
*/
|
|
public function deleteFiles($recordIds){
|
|
global $db;
|
|
$db=PearDatabase::getInstance();
|
|
$getAttachmentsIdQuery='SELECT * FROM vtiger_seattachmentsrel WHERE crmid in('.generateQuestionMarks($recordIds).')';
|
|
$result=$db->pquery($getAttachmentsIdQuery,array($recordIds));
|
|
$attachmentsIds=array();
|
|
if($db->num_rows($result)){
|
|
for($i=0;$i<($db->num_rows($result));$i++){
|
|
$attachmentsIds[$i]=$db->query_result($result,$i,'attachmentsid');
|
|
}
|
|
}
|
|
if(!empty($attachmentsIds)){
|
|
$deleteRelQuery='DELETE FROM vtiger_seattachmentsrel WHERE crmid in('.generateQuestionMarks($recordIds).')';
|
|
$db->pquery($deleteRelQuery,array($recordIds));
|
|
$attachmentsLocation=array();
|
|
$getPathQuery='SELECT * FROM vtiger_attachments WHERE attachmentsid in ('.generateQuestionMarks($attachmentsIds).')';
|
|
$pathResult=$db->pquery($getPathQuery,array($attachmentsIds));
|
|
if($db->num_rows($pathResult)){
|
|
for($i=0;$i<($db->num_rows($pathResult));$i++){
|
|
$attachmentsLocation[$i]=$db->query_result($pathResult,$i,'path');
|
|
$attachmentName=$db->query_result($pathResult,$i,'name');
|
|
$attachmentId=$db->query_result($pathResult,$i,'attachmentsid');
|
|
$fileName=$attachmentsLocation[$i].$attachmentId.'_'.decode_html($attachmentName);
|
|
if(file_exists($fileName)){
|
|
chmod($fileName,0750);
|
|
unlink($fileName);
|
|
}
|
|
}
|
|
}
|
|
$deleteAttachmentQuery='DELETE FROM vtiger_attachments WHERE attachmentsid in ('.generateQuestionMarks($attachmentsIds).')';
|
|
$db->pquery($deleteAttachmentQuery,array($attachmentsIds));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Function to restore the deleted records.
|
|
* @param type $sourceModule
|
|
* @param type $recordIds
|
|
*/
|
|
public function restore($sourceModule, $recordIds){
|
|
$focus = CRMEntity::getInstance($sourceModule);
|
|
for($i=0;$i<count($recordIds);$i++) {
|
|
if(!empty($recordIds[$i])) {
|
|
$focus->restore($sourceModule, $recordIds[$i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function getDeletedRecordsTotalCount() {
|
|
$db = PearDatabase::getInstance();
|
|
$totalCount = $db->pquery('select count(*) as count from vtiger_crmentity where deleted=1',array());
|
|
return $db->query_result($totalCount, 0, 'count');
|
|
}
|
|
|
|
/**
|
|
* Function to check deleted records exists in recyclebin
|
|
* @return <Boolean> true/false
|
|
*/
|
|
public function isRecordsDeleted() {
|
|
$db = PearDatabase::getInstance();
|
|
$totalCount = $db->pquery('SELECT 1 FROM vtiger_crmentity WHERE deleted=1 LIMIT 1',array());
|
|
if($db->num_rows($totalCount) > 0) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
* Function to get supported utility actions for a module
|
|
*/
|
|
function getUtilityActionsNames() {
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Funxtion to identify if the module supports quick search or not
|
|
*/
|
|
public function isQuickSearchEnabled() {
|
|
return true;
|
|
}
|
|
}
|