Files
crm.clientright.ru/modules/Workflow2/lib/Workflow/FrontendActions.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

401 lines
16 KiB
PHP

<?php
namespace Workflow;
class FrontendActions
{
const MAX_DELAY = 30;
private static $_DirectActions = array();
/**
* Modulename these Actions belong to
*
* @var string
*/
private $_module = null;
private $_entityMod = false;
public function __construct($module) {
$this->_module = $module;
$adb = \PearDatabase::getInstance();
$sql = 'SELECT tabid FROM vtiger_tab WHERE name = ? AND isentitytype = 1';
$result = $adb->pquery($sql, array($this->_module));
if($adb->num_rows($result) > 0) {
$this->_entityMod = true;
}
}
public function isEntityMod() {
return $this->_entityMod;
}
public function push($crmid, $action, $configuration, $afterWhichUserAction) {
if(!is_array($_SESSION['_wfd'])) {
$_SESSION['_wfd'] = array();
}
if(!is_array($_SESSION['_wfd']['frontendActions'])) {
$_SESSION['_wfd']['frontendActions'] = array();
}
if(!is_array($_SESSION['_wfd']['frontendActions'][$crmid])) {
$_SESSION['_wfd']['frontendActions'][$crmid] = array();
}
if(!is_array($_SESSION['_wfd']['frontendActions'][$crmid][$afterWhichUserAction])) {
$_SESSION['_wfd']['frontendActions'][$crmid][$afterWhichUserAction] = array();
}
$_SESSION['_wfd']['frontendActions'][$crmid][$afterWhichUserAction][] = array(
'type' => $action,
'configuration' => $configuration,
'timestamp' => time()
);
}
public function fetch($crmid, $afterWhichUserAction) {
//var_dump($_SESSION['_wfd']);exit();
if(!is_array($_SESSION['_wfd'])) {
return array();
}
if(!is_array($_SESSION['_wfd']['frontendActions'])) {
return array();
}
if(!is_array($_SESSION['_wfd']['frontendActions'][$crmid])) {
return array();
}
if(!is_array($_SESSION['_wfd']['frontendActions'][$crmid][$afterWhichUserAction])) {
$tmpActions = array();
} else {
$tmpActions = $_SESSION['_wfd']['frontendActions'][$crmid][$afterWhichUserAction];
}
if($afterWhichUserAction === 'init' && is_array($_SESSION['_wfd']['frontendActions'][$crmid]['edit'])) {
$tmpActions = array_merge($tmpActions, $_SESSION['_wfd']['frontendActions'][$crmid]['edit']);
$_SESSION['_wfd']['frontendActions'][$crmid]['edit'] = array();
}
if(empty($tmpActions)) {
return array();
}
$return = array();
foreach($tmpActions as $index => $action) {
if($action['timestamp'] > time() - self::MAX_DELAY) {
$return[] = $action;
}
}
$_SESSION['_wfd']['frontendActions'][$crmid][$afterWhichUserAction] = array();
return $return;
}
public function get($crmid, $type) {
switch($type) {
case 'message':
return $this->fetchMessages($crmid);
break;
case 'confirmation':
return $this->fetchConfirmation($crmid);
break;
case 'reqvalue':
return $this->fetchReqValues($crmid);
break;
}
return array();
}
public function fetchConfirmation($crmid) {
global $current_user;
$adb = \PearDatabase::getInstance();
if($this->_entityMod == false) return array();
$sql = "SELECT
vtiger_wf_confirmation.*,
vtiger_wf_confirmation.id as conf_id,
vtiger_wf_settings.*,
vtiger_wfp_blocks.text as block_title,
vtiger_wfp_blocks.settings as block_settings,
vtiger_users.user_name,
vtiger_users.first_name,
vtiger_users.last_name
FROM
vtiger_wf_confirmation_user
INNER JOIN vtiger_wf_confirmation ON(vtiger_wf_confirmation.id = vtiger_wf_confirmation_user.confirmation_id)
INNER JOIN vtiger_crmentity ON(vtiger_crmentity.crmid = vtiger_wf_confirmation.crmid AND vtiger_crmentity.deleted = 0)
INNER JOIN vtiger_wf_settings ON(vtiger_wf_settings.id = vtiger_wf_confirmation.workflow_id)
INNER JOIN vtiger_wfp_blocks ON(vtiger_wfp_blocks.id = vtiger_wf_confirmation.blockID)
INNER JOIN vtiger_wf_queue ON(vtiger_wf_queue.crmid = vtiger_wf_confirmation.crmid AND vtiger_wf_queue.execID = vtiger_wf_confirmation.execID AND vtiger_wf_queue.block_id =vtiger_wf_confirmation.blockID)
INNER JOIN vtiger_users ON(vtiger_users.id = vtiger_wf_confirmation.from_user_id)
WHERE
user_id = ".$current_user->id." AND vtiger_wf_confirmation.visible = 1 AND vtiger_wf_confirmation.crmid = ".$crmid." AND vtiger_wf_confirmation.result_user_id = 0
GROUP BY
vtiger_wf_confirmation.id ORDER BY block_title
LIMIT 1
";
$result = $adb->query($sql, true);
$return = array();
if($adb->num_rows($result) > 0) {
$context = VTEntity::getForId($crmid);
}
while($row = $adb->fetchByAssoc($result)) {
$settings = \Workflow\VtUtils::json_decode(html_entity_decode($row["block_settings"]));
if(!isset($settings["btn_accept"])) {
$settings["btn_accept"] = "LBL_OK";
}
if(!isset($settings["btn_rework"])) {
$settings["btn_rework"] = "LBL_REWORK";
}
if(!isset($settings["btn_decline"])) {
$settings["btn_decline"] = "LBL_DECLINE";
}
if(strpos($settings["btn_accept"], '$') !== false) {
$settings["btn_accept"] = \Workflow\VTTemplate::parse($settings["btn_accept"], $context);
}
if(strpos($settings["btn_rework"], '$') !== false) {
$settings["btn_rework"] = VTTemplate::parse($settings["btn_accept"], $context);
}
if(strpos($settings["btn_decline"], '$') !== false) {
$settings["btn_decline"] = VTTemplate::parse($settings["btn_accept"], $context);
}
$buttons['btn_accept'] = vtranslate($settings["btn_accept"], 'Settings:Workflow2');
$buttons['btn_rework'] = vtranslate($settings["btn_rework"], 'Settings:Workflow2');
$buttons['btn_decline'] = vtranslate($settings["btn_decline"], 'Settings:Workflow2');
$row['buttons'] = $buttons;
$row['text_eingestellt'] = vtranslate('Eingestellt', 'Workflow2');
$row['timestamp'] = \DateTimeField::convertToUserFormat($row['timestamp']);
if(substr($row['backgroundcolor'], 0, 1) == '#') {
$row['border'] = VtUtils::getGoodBorderColor($row['backgroundcolor']);
} else {
$row['border'] = '';
}
$row['hash1'] = md5($current_user->id."##ok##".$row["conf_id"]);
$row['hash2'] = md5($current_user->id."##rework##".$row["conf_id"]);
$row['hash3'] = md5($current_user->id."##decline##".$row["conf_id"]);
$return[] = $row;
}
return $return;
}
public function fetchReqValues($crmid) {
$result = array();
$sql = '';
return $result;
}
public function fetchMessages($crmid) {
$current_user = $cu_model = \Users_Record_Model::getCurrentUserModel();
$adb = \PearDatabase::getInstance();
if(empty($crmid)) $crmid = 0;
$sql = 'SELECT * FROM vtiger_wf_messages WHERE
(
(crmid = '.$crmid.' AND target = "record") OR
(crmid = '.$current_user->id.' AND target = "user")
)
AND (show_until = "0000-00-00 00:00:00" OR show_until >= NOW())';
$result = VtUtils::query($sql);
$messages = array();
while($row = $adb->fetchByAssoc($result)) {
if($row['show_until'] != '0000-00-00 00:00:00') {
$row['show_until'] = getTranslatedString('LBL_VISIBLE_UNTIL', 'Workflow2').': '.\DateTimeField::convertToUserFormat($row['show_until']);
} else {
$row['show_until'] = '';
}
$messages[] = $row;
}
$sql = "DELETE FROM vtiger_wf_messages WHERE
(
(crmid = ".intval($_REQUEST["record"])." AND target = 'record') OR
(crmid = ".intval($current_user->id)." AND target = 'user')
) AND
(show_once = '1' OR (show_until != '0000-00-00 00:00:00' AND show_until < NOW()))";
$adb->query($sql);
return $messages;
}
public function removeActionType($crmid, $afterWhichUserAction, $removeAction) {
if(!is_array($_SESSION['_wfd'])) {
return;
}
if(!is_array($_SESSION['_wfd']['frontendActions'])) {
return;
}
if(!is_array($_SESSION['_wfd']['frontendActions'][$crmid])) {
return;
}
if(!is_array($_SESSION['_wfd']['frontendActions'][$crmid][$afterWhichUserAction])) {
return;
}
$tmpActions = $_SESSION['_wfd']['frontendActions'][$crmid][$afterWhichUserAction];
foreach($tmpActions as $index => $action) {
if($action['type'] == $removeAction) {
unset($_SESSION['_wfd']['frontendActions'][$crmid][$afterWhichUserAction][$index]);
}
}
}
public function getTriggerButtons($moduleName, $crmid) {
$adb = \PearDatabase::getInstance();
if($this->_entityMod == false) return array();
if(!empty($crmid)) {
$crmid = VTEntity::getForId($crmid);
if(empty($crmid) || !is_object($crmid)) return array();
}
$sql = 'SELECT vtiger_wf_frontendmanager.*,
vtiger_wf_settings.authmanagement
FROM vtiger_wf_frontendmanager
INNER JOIN vtiger_wf_settings ON (vtiger_wf_settings.id = vtiger_wf_frontendmanager.workflow_id)
WHERE vtiger_wf_settings.active = 1 AND vtiger_wf_settings.module_name = ? AND invisible = 0';
$result = $adb->pquery($sql, array($moduleName));
$buttons = array();
while($workflow = $adb->fetchByAssoc($result)) {
$objWorkflow = new \Workflow\Main($workflow["workflow_id"]);
if(($workflow["authmanagement"] == "0" || $objWorkflow->checkAuth("view")) && (empty($crmid) || $objWorkflow->checkExecuteCondition($crmid))) {
$workflow['config'] = VtUtils::json_decode(html_entity_decode($workflow['config']));
if(!isset($buttons[$workflow['position']])) {
$buttons[$workflow['position']] = array();
}
if(!empty($workflow['config']['defaultlayout'])) {
$workflow['color'] = '';
}
$buttons[$workflow['position']][] = array(
'frontend_id' => $workflow['id'],
'workflow_id' => $workflow['workflow_id'],
'label' => $workflow['label'],
'color' => $workflow['color'],
'config' => $workflow['config'],
'textcolor' => \Workflow\VtUtils::getTextColor($workflow['color']),
);
}
}
return $buttons;
}
public function getInlineButtons($crmid) {
$adb = \PearDatabase::getInstance();
if($this->_entityMod == false) return array();
if(empty($crmid)) return array();
$crmid = VTEntity::getForId($crmid);
if(empty($crmid) || !is_object($crmid)) return array();
$sql = 'SELECT vtiger_wf_frontendmanager.*,
vtiger_wf_settings.authmanagement
FROM vtiger_wf_frontendmanager
INNER JOIN vtiger_wf_settings ON (vtiger_wf_settings.id = vtiger_wf_frontendmanager.workflow_id)
WHERE vtiger_wf_frontendmanager.position = "fieldbtn" AND vtiger_wf_settings.active = 1 AND vtiger_wf_settings.module_name = ? AND invisible = 0';
$result = $adb->pquery($sql, array($crmid->getModuleName()));
$buttons = array();
while($workflow = $adb->fetchByAssoc($result)) {
$objWorkflow = new \Workflow\Main($workflow["workflow_id"]);
if(($workflow["authmanagement"] == "0" || $objWorkflow->checkAuth("view")) && $objWorkflow->checkExecuteCondition($crmid)) {
$workflow['config'] = VtUtils::json_decode(html_entity_decode($workflow['config']));
$buttons[] = array(
'frontend_id' => $workflow['id'],
'workflow_id' => $workflow['workflow_id'],
'label' => $workflow['label'],
'color' => $workflow['color'],
'config' => $workflow['config'],
'textcolor' => \Workflow\VtUtils::getTextColor($workflow['color']),
);
}
}
return $buttons;
}
public function showGeneralButton() {
$adb = \PearDatabase::getInstance();
$sql = 'SELECT COUNT(*) as num FROM vtiger_wf_settings WHERE module_name = ? AND active = 1 AND invisible = 0';
$result = VtUtils::pquery($sql, array($this->_module));
if($adb->query_result($result, 0, 'num') == 0) return false;
return $this->_entityMod;
}
public function getDetailViewTopbuttons($crmid) {
$adb = \PearDatabase::getInstance();
if($this->_entityMod == false) return array();
if(empty($crmid)) return array();
$crmid = VTEntity::getForId($crmid);
if(empty($crmid) || !is_object($crmid)) return array();
$sql = 'SELECT vtiger_wf_frontendmanager.*,
vtiger_wf_settings.authmanagement
FROM vtiger_wf_frontendmanager
INNER JOIN vtiger_wf_settings ON (vtiger_wf_settings.id = vtiger_wf_frontendmanager.workflow_id)
WHERE vtiger_wf_frontendmanager.position = "detailbtn" AND vtiger_wf_settings.active = 1 AND vtiger_wf_settings.module_name = ? AND invisible = 0';
$result = $adb->pquery($sql, array($crmid->getModuleName()));
$buttons = array();
while($workflow = $adb->fetchByAssoc($result)) {
$objWorkflow = new \Workflow\Main($workflow["workflow_id"]);
if(($workflow["authmanagement"] == "0" || $objWorkflow->checkAuth("view")) && $objWorkflow->checkExecuteCondition($crmid)) {
$workflow['config'] = VtUtils::json_decode(html_entity_decode($workflow['config']));
if(!empty($workflow['config']['defaultlayout'])) {
$workflow['color'] = '';
}
$buttons[] = array(
'frontend_id' => $workflow['id'],
'workflow_id' => $workflow['workflow_id'],
'label' => $workflow['label'],
'color' => $workflow['color'],
'config' => $workflow['config'],
'textcolor' => !empty($workflow['color'])?\Workflow\VtUtils::getTextColor($workflow['color']):'',
);
}
}
return $buttons;
}
public static function pushDirectaction($type, $configuration) {
self::$_DirectActions[] = array(
'execid' => \Workflow2::$currentWorkflowObj->getLastExecID(),
'blockid' => \Workflow2::$currentBlockObj->getBlockId(),
'type' => $type,
'config' => $configuration
);
}
public static function getDirectActions() {
return self::$_DirectActions;
}
}
?>