Files
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

113 lines
4.9 KiB
PHP

<?php
/*+**********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.1
* ("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 Settings_LayoutEditor_Block_Action extends Settings_Vtiger_Index_Action {
public function __construct() {
$this->exposeMethod('save');
$this->exposeMethod('updateSequenceNumber');
$this->exposeMethod('delete');
}
public function save(Vtiger_Request $request) {
$blockId = $request->get('blockid');
$sourceModule = $request->get('sourceModule');
$modueInstance = Vtiger_Module_Model::getInstance($sourceModule);
if(!empty($blockId)) {
$blockInstance = Settings_LayoutEditor_Block_Model::getInstance($blockId);
$blockInstance->set('display_status',$request->get('display_status'));
$isDuplicate = false;
} else {
$blockInstance = new Settings_LayoutEditor_Block_Model();
$blockInstance->set('label', $request->get('label'));
$blockInstance->set('iscustom', '1');
//Indicates block id after which you need to add the new block
$beforeBlockId = $request->get('beforeBlockId');
if(!empty($beforeBlockId)) {
$beforeBlockInstance = Vtiger_Block_Model::getInstance($beforeBlockId);
$beforeBlockSequence = $beforeBlockInstance->get('sequence');
$newBlockSequence = ($beforeBlockSequence+1);
//To give sequence one more than prev block
$blockInstance->set('sequence', $newBlockSequence);
//push all other block down so that we can keep new block there
Vtiger_Block_Model::pushDown($beforeBlockSequence, $modueInstance->getId());
}
$isDuplicate = Vtiger_Block_Model::checkDuplicate(trim($request->get('label')), $modueInstance->getId());
}
$response = new Vtiger_Response();
if (!$isDuplicate) {
try{
$id = $blockInstance->save($modueInstance);
$responseInfo = array('id'=>$id,'label'=>$blockInstance->get('label'),'isCustom'=>$blockInstance->isCustomized(), 'beforeBlockId'=>$beforeBlockId, 'isAddCustomFieldEnabled'=>$blockInstance->isAddCustomFieldEnabled());
if(empty($blockId)) {
//if mode is create add all blocks sequence so that client will place the new block correctly
$responseInfo['sequenceList'] = Vtiger_Block_Model::getAllBlockSequenceList($modueInstance->getId());
}
$response->setResult($responseInfo);
} catch(Exception $e) {
$response->setError($e->getCode(),$e->getMessage());
}
} else {
$response->setError('502', vtranslate('LBL_DUPLICATES_EXIST', $request->getModule(false)));
}
$response->emit();
}
public function updateSequenceNumber(Vtiger_Request $request) {
$response = new Vtiger_Response();
try{
$sequenceList = $request->get('sequence');
Vtiger_Block_Model::updateSequenceNumber($sequenceList,$request->get('selectedModule'));
$response->setResult(array('success'=>true));
}catch(Exception $e) {
$response->setError($e->getCode(),$e->getMessage());
}
$response->emit();
}
public function delete(Vtiger_Request $request) {
$response = new Vtiger_Response();
$blockId = $request->get('blockid');
$checkIfFieldsExists = Vtiger_Block_Model::checkFieldsExists($blockId);
if($checkIfFieldsExists) {
//SalesPlatform.ru begin
// $response->setError('502','Fields exists for the block');
$response->setError('502', vtranslate('LBL_FIELDS_EXIST_FOR_THE_BLOCK', $request->getModule(false)));
//SalesPlatform.ru end
$response->emit();
return;
}
$blockInstance = Vtiger_Block_Model::getInstance($blockId);
if(!$blockInstance->isCustomized()) {
$response->setError('502','Cannot delete non custom blocks');
$response->emit();
return;
}
try{
$sourceModule = $blockInstance->get('module')->name;
$blockLabel = $blockInstance->get('label');
$blockInstance->delete(false);
// Settings_LayoutEditor_Module_Model::removeLabelFromLangFile($sourceModule, $blockLabel);
$response->setResult(array('success'=>true));
}catch(Exception $e) {
$response->setError($e->getCode(),$e->getMessage());
}
$response->emit();
}
public function validateRequest(Vtiger_Request $request) {
$request->validateWriteAccess();
}
}