Files
crm.clientright.ru/modules/ProjectTask/views/MassActionAjax.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

230 lines
8.8 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 ProjectTask_MassActionAjax_View extends Project_MassActionAjax_View {
protected function getEmailFieldsInfo(Vtiger_Request $request) {
$sourceModule = $request->getModule();
$emailFieldsInfo = parent::getEmailFieldsInfo($request);
//get parent email fields and their reference email fields
$moduleModel = Vtiger_Module_Model::getInstance('Project');
$recipientPrefModel = Vtiger_RecipientPreference_Model::getInstance($sourceModule);
if ($recipientPrefModel)
$recipientPrefs = $recipientPrefModel->getPreferences();
$moduleEmailPrefs = $recipientPrefs[$moduleModel->getId()];
$emailAndRefFields = $moduleModel->getFieldsByType(array('email', 'reference'));
$accesibleFields = array();
$referenceFieldValues = array();
foreach ($emailAndRefFields as $field) {
$fieldName = $field->getName();
if ($field->isViewable()) {
if ($moduleEmailPrefs && in_array($field->getId(), $moduleEmailPrefs)) {
$field->set('isPreferred', true);
}
$accesibleFields[$fieldName] = $field;
}
}
$allEmailFields = array();
$moduleEmailFields = $moduleModel->getFieldsByType(array('email'));
foreach ($moduleEmailFields as $moduleEmailField) {
if ($moduleEmailField->isViewable()) {
if ($moduleEmailPrefs && in_array($moduleEmailField->getId(), $moduleEmailPrefs)) {
$moduleEmailField->set('isPreferred', true);
}
$allEmailFields[$sourceModule][$moduleEmailField->getFieldName()] = $moduleEmailField;
}
}
$referenceFields = $moduleModel->getFieldsByType(array('reference'));
foreach ($referenceFields as $referenceField) {
$referenceModules = $referenceField->getReferenceList();
$refModuleName = $referenceModules[0];
if (empty($refModuleName) || $refModuleName == 'Users') {
continue;
}
$refModule = Vtiger_Module_Model::getInstance($refModuleName);
if ($refModule) {
$refModuleEmailFields = $refModule->getFieldsByType(array('email'));
if (empty($refModuleEmailFields)) {
continue;
}
$refModuleEmailPrefs = $recipientPrefs[$refModule->getId()];
foreach ($refModuleEmailFields as $refModuleEmailField) {
if ($refModuleEmailField->isViewable()) {
$refModuleEmailField->set('baseRefField', $referenceField->getFieldName());
if ($refModuleEmailPrefs && in_array($refModuleEmailField->getId(), $refModuleEmailPrefs)) {
$refModuleEmailField->set('isPreferred', true);
}
$allEmailFields[$refModuleName][$refModuleEmailField->getFieldName()] = $refModuleEmailField;
}
}
}
}
if (count($accesibleFields) > 0) {
$projectTaskIds = $this->getRecordsListFromRequest($request);
//get parent project records
$projectIds = $this->getProjectIds($projectTaskIds);
global $current_user;
$queryGen = new QueryGenerator($moduleModel->getName(), $current_user);
$selectFields = array_keys($accesibleFields);
$queryGen->setFields($selectFields);
$query = $queryGen->getQuery();
$query = $query.' AND crmid IN ('.generateQuestionMarks($projectIds).')';
$emailOptout = $moduleModel->getField('emailoptout');
if ($emailOptout) {
$query .= ' AND '.$emailOptout->get('column').' = 0';
}
$db = PearDatabase::getInstance();
$result = $db->pquery($query, $projectIds);
$num_rows = $db->num_rows($result);
if ($num_rows > 0) {
for ($i = 0; $i < $num_rows; $i++) {
$emailFieldsList = array();
foreach ($accesibleFields as $field) {
$fieldValue = $db->query_result($result, $i, $field->get('column'));
if (!empty($fieldValue)) {
if (in_array($field->getFieldDataType(), array('reference'))) {
$referenceFieldValues[$projectTaskIds[$i]][] = $fieldValue;
} else {
$emailFieldsList[$fieldValue] = $field;
}
}
}
if (!empty($emailFieldsList)) {
$emailFieldsInfo[$projectTaskIds[$i]][$moduleModel->getName()] = $emailFieldsList;
}
}
}
}
if (!empty($referenceFieldValues)) {
foreach ($referenceFieldValues as $recordId => $refRecordIds) {
foreach ($refRecordIds as $refRecordId) {
$refModuleName = Vtiger_Functions::getCRMRecordType($refRecordId);
if (empty($refModuleName) || $refModuleName == 'Users')
continue;
$refModuleModel = Vtiger_Module_Model::getInstance($refModuleName);
if (!$refModuleModel || !$refModuleModel->isActive() || !Users_Privileges_Model::isPermitted($refModuleModel->getName(), 'DetailView'))
continue;
$refModuleEmailPrefs = $recipientPrefs[$refModuleModel->getId()];
$refModuleEmailFields = $refModuleModel->getFieldsByType('email');
if (empty($refModuleEmailFields))
continue;
$accesibleFields = array();
foreach ($refModuleEmailFields as $fieldModel) {
if (!$fieldModel->isViewable())
continue;
if ($refModuleEmailPrefs && in_array($fieldModel->getId(), $refModuleEmailPrefs)) {
$fieldModel->set('isPreferred', true);
}
$accesibleFields[$fieldModel->getName()] = $fieldModel;
}
$refModuleEmailFields = $accesibleFields;
$qGen = new QueryGenerator($refModuleName, $current_user);
$qGen->setFields(array_keys($refModuleEmailFields));
$query = $qGen->getQuery();
$query .= " AND crmid = $refRecordId";
$params = array();
if ($refModuleModel->getField('emailoptout')) {
$query .= ' AND '.$refModuleModel->basetable.'.emailoptout = ?';
$params[] = 0;
}
$result = $db->pquery($query, $params);
$numRows = $db->num_rows($result);
$emailFieldList = array();
if ($numRows > 0) {
foreach ($refModuleEmailFields as $emailFieldName => $emailField) {
$emailValue = $db->query_result($result, 0, $emailFieldName);
if (!empty($emailValue)) {
$emailFieldList[$emailValue] = $emailField;
}
}
}
if (!empty($emailFieldList)) {
$emailFieldsInfo[$recordId][$refModuleName] = $emailFieldList;
}
}
}
}
$viewer = $this->getViewer($request);
$viewer->assign('RECORDS_COUNT', count($projectTaskIds));
if ($recipientPrefModel && !empty($recipientPrefs)) {
$viewer->assign('RECIPIENT_PREF_ENABLED', true);
}
$viewer->assign('EMAIL_FIELDS', $allEmailFields);
return $emailFieldsInfo;
}
protected function getProjectIds($taskIds = array()) {
$projectIds = array();
if (!empty($taskIds)) {
$db = PearDatabase::getInstance();
$sql = 'SELECT projectid FROM vtiger_projecttask INNER JOIN vtiger_crmentity ON vtiger_projecttask.projecttaskid = vtiger_crmentity.crmid
WHERE vtiger_crmentity.deleted=0 AND vtiger_crmentity.crmid IN ('.generateQuestionMarks($taskIds).')';
$params = $taskIds;
$result = $db->pquery($sql, $params);
$numRows = $db->num_rows($result);
if ($numRows > 0) {
for ($i = 0; $i < $numRows; $i++) {
$projectIds[] = $db->query_result($result, $i, 'projectid');
}
}
}
return $projectIds;
}
protected function isPreferencesNeedToBeUpdated(Vtiger_Request $request) {
$parentStatus = parent::isPreferencesNeedToBeUpdated($request);
if (!$parentStatus) {
$recipientPrefModel = Vtiger_RecipientPreference_Model::getInstance($request->getModule());
if (!$recipientPrefModel)
return $parentStatus;
$prefs = $recipientPrefModel->getPreferences();
$moduleModel = Vtiger_Module_Model::getInstance('Project');
$refFields = $moduleModel->getFieldsByType(array('reference'));
foreach ($refFields as $refField) {
if ($refField && $refField->isViewable()) {
$referenceList = $refField->getReferenceList();
foreach ($referenceList as $moduleName) {
if ($moduleName !== 'Users') {
$refModuleModel = Vtiger_Module_Model::getInstance($moduleName);
if (!$prefs[$refModuleModel->getId()])
continue;
$moduleEmailPrefs = $prefs[$refModuleModel->getId()];
foreach ($moduleEmailPrefs as $fieldId) {
$field = Vtiger_Field_Model::getInstance($fieldId, $refModuleModel);
if ($field) {
if (!$field->isActiveField()) {
$parentStatus = true;
}
} else {
$parentStatus = true;
}
}
}
}
}
}
}
return $parentStatus;
}
}