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

253 lines
9.3 KiB
PHP

<?php
/**
* Created by JetBrains PhpStorm.
* User: Stefan Warnat <support@stefanwarnat.de>
* Date: 12.04.14 18:30
* You must not use this file without permission.
*/
namespace Workflow;
class ConditionMysql
{
private $_context = false;
private $_sql = array();
private $_module = "";
private $_joinTables = array();
private $_logger = false;
public function __construct($module, $context) {
$this->_module = $module;
$this->_context = $context;
}
public function generateTables($includeAllModTables = false) {
/**
* @var $obj CRMEntity
*/
$obj = \CRMEntity::getInstance($this->_module);
$sql = array();
$sql[] = "FROM ".$obj->table_name;
$relations = $obj->tab_name_index;
$pastJoinTables = array($obj->table_name);
foreach($relations as $table => $index) {
if(in_array($table, $pastJoinTables)) {
continue;
}
$postJoinTables[] = $table;
if($table == "vtiger_crmentity") {
$join = "INNER";
} else {
$join = "LEFT";
}
$sql[] = $join." JOIN `".$table."` ON (`".$table."`.`".$index."` = `".$obj->table_name."`.`".$obj->table_index."`)";
}
$sql = array_merge($sql, array_values($this->_joinTables));
return implode("\n", $sql);
}
/**
* @param $conditions
* @param $context CRMEntity
* @return bool
*/
public function parse($conditions) {
if(empty($conditions) || $conditions == -1) {
if($this->_module == 'Leads') {
return 'vtiger_leaddetails.converted = 0 ';
}
return '';
}
$this->_checkGroup($conditions);
if($this->_module == 'Leads') {
$this->_sql[] = ' AND vtiger_leaddetails.converted = 0 ';
}
return implode(" ",$this->_sql);
}
private function _checkGroup($condition) {
$this->_sql[] = "(";
// Jeden Eintrag in Gruppe durchlaufen
foreach($condition as $check) {
if($check["type"] == "group") {
$this->_checkGroup($check["childs"]);
} elseif($check["type"] == "field") {
$tmpResult = $this->_checkField($check);
}
if ($check["join"] == "and") {
$this->_sql[] = "AND";
} else {
$this->_sql[] = "OR";
}
}
if(in_array($this->_sql[count($this->_sql) - 1], array("AND", "OR"))) {
array_pop($this->_sql);
}
$this->_sql[] = ")";
}
private function _checkField($check) {
global $adb;
if(is_string($check['rawvalue']) && $check["mode"] != 'function') {
$check['rawvalue'] = array('value' => $check['rawvalue']);
}
// static Value
if($check["mode"] == "value" || empty($check["mode"])) {
// var_dump($check["field"]);
$checkvalue = $check["rawvalue"];
if(is_array($checkvalue)) {
foreach ($checkvalue as $index => $val) {
if (strpos($val, '$') !== false || strpos($val, '?') !== false) {
$objTemplate = new VTTemplate($this->_context);
$checkvalue[$index] = $objTemplate->render($val);
}
}
}
} elseif($check["mode"] == "function") {
$parser = new ExpressionParser($check["rawvalue"], $this->_context, false); # Last Parameter = DEBUG
try {
$parser->run();
} catch(ExpressionException $exp) {
\Workflow2::error_handler(E_EXPRESSION_ERROR, $exp->getMessage(), "", "");
}
$checkvalue = $parser->getReturn();
if(!is_array($checkvalue)) {
$checkvalueTMP = array();
$checkvalueTMP['value'] = $checkvalue;
$checkvalue = $checkvalueTMP;
}
}
if(!empty($checkvalue['value']) && preg_match("/^([0-9]+)x([0-9]+)$/", $checkvalue['value'], $matches)) {
$checkvalue = $matches[2];
}
if($check["field"] != "crmid") {
if(preg_match('/\((\w+) ?: \(([_\w]+)\) (\w+)\)/', $check["field"], $matches)) {
if($matches[2] == 'ModuleName') {
$fieldInfoReference = VtUtils::getFieldInfo($matches[1], getTabid($this->_module));
$joinTableKey = ucfirst('vtiger_crmentity') . '' . $matches[1].'_setype';
$alias = 't' . md5($joinTableKey);
if (!isset($this->_joinTables[$joinTableKey])) {
$this->_joinTables[$joinTableKey] = 'LEFT JOIN vtiger_crmentity as ' . $alias . ' ON(' . $alias . '.crmid = ' . $fieldInfoReference['tablename'] . '.' . $fieldInfoReference['columnname'] . ' AND ' . $alias . '.deleted = 0)';
}
$fieldNames = array("`" . $alias . "`.`setype`");
} else {
$fieldData = VtUtils::getFieldInfo($matches[3], getTabid($matches[2]));
if($fieldData['tablename'] == 'vtiger_inventoryproductrel') {
$fieldNames = array("`" . $fieldData['tablename'] . "`.`" . $fieldData["columnname"] . '`');
} else {
$fieldInfoReference = VtUtils::getFieldInfo($matches[1], getTabid($this->_module));
$obj = \CRMEntity::getInstance($matches[2]);
//$objReference = \CRMEntity::getInstance($this->_module);
if (empty($obj->tab_name_index[$fieldData['tablename']])) {
return false;
}
$joinTableKey = ucfirst($fieldData['tablename']) . '' . ucfirst($matches[0]);
$alias = 't' . md5($joinTableKey);
if (!isset($this->_joinTables[$joinTableKey])) {
$this->_joinTables[$joinTableKey] = 'INNER JOIN ' . $fieldData['tablename'] . ' as ' . $alias . ' ON(' . $alias . '.' . $obj->tab_name_index[$fieldData['tablename']] . ' = ' . $fieldInfoReference['tablename'] . '.' . $fieldInfoReference['columnname'] . ')';
}
$fieldNames = array("`" . $alias . "`.`" . $fieldData["columnname"] . '`');
}
} // $matches[2] != 'ModuleName'
} else {
$sql = "SELECT columnname, tablename, uitype FROM vtiger_field WHERE (fieldname = ? OR columnname = ?) AND tabid = " . getTabId($this->_module);
$result = $adb->pquery($sql, array($check["field"], $check["field"]), true);
$fieldData = $adb->fetchByAssoc($result);
if ($fieldData["columnname"] == "idlists" && $this->_module == "Emails") {
$fieldNames = array("`vtiger_seactivityrel`.`crmid`");
} else {
$fieldNames = array("`" . $fieldData["tablename"] . "`.`" . $fieldData["columnname"] . '`');
}
}
if(in_array(intval($fieldData["uitype"]), VtUtils::$referenceUitypes) && empty($check["not"]) && $check["operation"] == 'equal') {
$check['operation'] = 'core/reference_equal';
/*
$modules = VtUtils::getModuleForReference(getTabId($this->_module), $check["field"], $fieldData["uitype"]);
if(count($modules) == 1) {
foreach($modules as $module) {
$tmpFocus = \CRMEntity::getInstance($module);
$tableName = "t".count($this->_joinTables)."_".$module."_".$check["field"]."";
$this->_joinTables[] = "LEFT JOIN ".$tmpFocus->table_name." as ".$tableName." ON (`".$tableName."`.`".$tmpFocus->table_index."` = `".$fieldNames[0]."`)";
$fieldData["tablename"] = $tableName;
$fieldData["columnname"] = $tmpFocus->list_link_field;
//if(!is_numeric($checkvalue)) {
$fieldNames[] = "".$fieldData["tablename"]."`.`".$fieldData["columnname"];
//} else {
// $fieldNames = array("".$fieldData["tablename"]."`.`".$fieldData["columnname"]);
// }
}
}*/
}
} else {
$fieldNames = array("`vtiger_crmentity`.`crmid`");
}
$this->log("Check field: ".$check["field"]." ".(!empty($check["not"])?'not':'')." ".$check["operation"]." ".json_encode($checkvalue));
# var_dump($fieldvalue." - ".($check["not"]=="1"?"NOT ":"").$check["operation"]." - ".$checkvalue);echo "<br>";
if(!empty($check["not"])) {
$not = true;
} else {
$not = false;
}
$sql = \Workflow\ConditionPlugin::getSQLCondition($check['operation'], $this->_module, $fieldNames[0], $checkvalue, $not);
$this->_sql[] = $sql;
return false;
}
public function log($value) {
ExecutionLogger::getCurrentInstance()->log($value);
}
/**
* Set the Log-Routine, to log every Check
* @deprecated
* @param $logger
*/
public function setLogger($logger) {
$this->_logger = $logger;
}
}
?>