- 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.
232 lines
8.5 KiB
PHP
232 lines
8.5 KiB
PHP
<?php
|
|
/**
|
|
This File was developed by Stefan Warnat <vtiger@stefanwarnat.de>
|
|
|
|
It belongs to the Workflow Designer and must not be distributed without complete extension
|
|
**/
|
|
|
|
require_once(realpath(dirname(__FILE__).'/../autoload_wf.php'));
|
|
|
|
/* vt6 ready 2014/04/12 */
|
|
class WfTaskExecExtWorkflow extends \Workflow\Task {
|
|
|
|
protected $_envSettings = array("result_environments");
|
|
|
|
public function init() {
|
|
if(-1 != $this->get("search_module") || !empty($_POST["task"]["search_module"])) {
|
|
$module = !empty($_POST["task"]["search_module"]) ? $_POST["task"]["search_module"] : $this->get("search_module");
|
|
$parts = explode('#~#', $module);
|
|
$this->addPreset("Condition", "condition", array(
|
|
'toModule' => VtUtils::getModuleName($parts[1]),
|
|
'mode' => 'mysql',
|
|
));
|
|
/*$this->addPreset("RecordSources", "recordsource", array(
|
|
'module' => VtUtils::getModuleName($parts[1]),
|
|
'default' => 'condition',
|
|
));*/
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* @param $context \Workflow\VTEntity
|
|
* @return string
|
|
*/
|
|
public function handleTask(&$context) {
|
|
global $adb;
|
|
|
|
if($this->get("search_module") == -1) {
|
|
return "no";
|
|
}
|
|
|
|
$found_rows = $this->get("found_rows");
|
|
if(empty($found_rows) || $found_rows == -1) {
|
|
$found_rows = 1;
|
|
}
|
|
|
|
$recordsource = $this->get('recordsource');
|
|
if(empty($recordsource) || $recordsource == -1) {
|
|
$recordsource = 'condition';
|
|
}
|
|
|
|
$parts = explode("#~#", $this->get("search_module"));
|
|
$functionName = $parts[0];
|
|
$related_module = VtUtils::getModuleName($parts[1]);
|
|
|
|
$recordids = array();
|
|
if($recordsource == 'condition') {
|
|
require_once('modules/Workflow2/VTConditionMySql.php');
|
|
|
|
$logger = \Workflow\ExecutionLogger::getCurrentInstance();
|
|
|
|
$objMySQL = new \Workflow\ConditionMysql($related_module, $context);
|
|
$objMySQL->setLogger($logger);
|
|
|
|
$main_module = CRMEntity::getInstance($related_module);
|
|
#$sqlTables = $main_module->generateReportsQuery($related_module);
|
|
|
|
$sqlCondition = $objMySQL->parse($this->get("condition"));
|
|
|
|
$sqlTables = $objMySQL->generateTables();
|
|
|
|
if(strlen($sqlCondition) > 3) {
|
|
$sqlCondition .= " AND vtiger_crmentity.deleted = 0";
|
|
} else {
|
|
$sqlCondition .= " vtiger_crmentity.deleted = 0";
|
|
}
|
|
|
|
$idColumn = $main_module->table_name.".".$main_module->table_index;
|
|
$sqlQuery = "SELECT $idColumn as `idCol` ".$sqlTables." WHERE ".(strlen($sqlCondition) > 3?$sqlCondition:"");
|
|
$sortField = $this->get("sort_field");
|
|
$sqlQuery .= ' GROUP BY vtiger_crmentity.crmid ';
|
|
|
|
if(!empty($sortField) && $sortField != -1) {
|
|
$sortDirection = $this->get("sortDirection");
|
|
$sortField = VtUtils::getColumnName($sortField);
|
|
$sqlQuery .= " ORDER BY ".$sortField." ".$sortDirection;
|
|
}
|
|
$numRows = $this->get("found_rows");
|
|
if(!empty($numRows) && $numRows != -1) {
|
|
$sqlQuery .= " LIMIT ".$found_rows;
|
|
}
|
|
|
|
$this->addStat("MySQL Query: ".$sqlQuery);
|
|
|
|
$result = $adb->query($sqlQuery, true);
|
|
|
|
$this->addStat("num Rows: ".$adb->num_rows($result));
|
|
|
|
while($row = $adb->fetchByAssoc($result)) {
|
|
$recordids[] = $row["idcol"];
|
|
}
|
|
}
|
|
if($recordsource == 'customview') {
|
|
$queryGenerator = new \QueryGenerator($related_module, \Users::getActiveAdminUser());
|
|
$queryGenerator->initForCustomViewById($this->get('customviewsource'));
|
|
$query = $queryGenerator->getQuery();
|
|
$parts = preg_split('/FROM/i', $query);
|
|
$sqlQuery = 'SELECT vtiger_crmentity.crmid as id_col FROM '.$parts[1];
|
|
$result = $adb->query($sqlQuery, true);
|
|
$this->addStat("num Rows: ".$adb->num_rows($result));
|
|
|
|
while($row = $adb->fetchByAssoc($result)) {
|
|
$recordids[] = $row["id_col"];
|
|
}
|
|
}
|
|
|
|
$filterbyproduct = $this->get('filterbyproduct');
|
|
|
|
if($filterbyproduct === 'yes') {
|
|
$products = $this->get('products');
|
|
if(!empty($products)) {
|
|
$sql = 'SELECT id FROM vtiger_inventoryproductrel WHERE id IN ('.generateQuestionMarks($recordids).') AND productid = ? GROUP BY id';
|
|
$recordids[] = $products;
|
|
$result = $adb->pquery($sql, $recordids);
|
|
|
|
$recordids = array();
|
|
while($row = $adb->fetchByAssoc($result)) {
|
|
$recordids[] = $row['id'];
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
$workflow_id = $this->get("workflow_id");
|
|
if(!empty($workflow_id)) {
|
|
foreach($recordids as $recordId) {
|
|
$tmpContext = \Workflow\VTEntity::getForId($recordId, $related_module);
|
|
$preserveEnvironment = $tmpContext->getEnvironment();
|
|
$tmpContext->clearEnvironment();
|
|
$tmpContext->loadEnvironment($context->getEnvironment());
|
|
$obj = new \Workflow\Main($workflow_id, false, $context->getUser());
|
|
$obj->setExecutionTrigger($this->getWorkflow()->getExecutionTrigger());
|
|
$obj->setContext($tmpContext);
|
|
$obj->isSubWorkflow(true);
|
|
|
|
$obj->start();
|
|
if($obj->getSuccessRedirection() != false) {
|
|
$this->getWorkflow()->setSuccessRedirection($obj->getSuccessRedirection(), $obj->getSuccessRedirectionTarget());
|
|
}
|
|
|
|
$env = $this->get("env");
|
|
if($env !== -1 && !empty($env["result_environments"])) {
|
|
$oldEnv = $context->getEnvironment($env["result_environments"]);
|
|
if(!is_array($oldEnv)) {
|
|
$oldEnv = array();
|
|
}
|
|
$oldEnv[] = $tmpContext->getEnvironment();
|
|
$context->setEnvironment("result_environments", $oldEnv, $this);
|
|
}
|
|
|
|
if(!empty($preserveEnvironment)) {
|
|
$tmpContext->loadEnvironment($preserveEnvironment);
|
|
}
|
|
}
|
|
}
|
|
|
|
return "yes";
|
|
}
|
|
|
|
public function beforeGetTaskform($viewer) {
|
|
global $adb, $current_language, $mod_strings;
|
|
|
|
$viewer->assign("related_modules", VtUtils::getEntityModules(true));
|
|
$search_module = $this->get("search_module");
|
|
|
|
if(!empty($_POST["task"]["search_module"])) {
|
|
$parts = explode("#~#", $_POST["task"]["search_module"]);
|
|
} elseif(!empty($search_module)) {
|
|
if($search_module != -1) {
|
|
$parts = explode("#~#", $search_module);
|
|
}
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
if(!empty($parts)) {
|
|
$viewer->assign("related_tabid", $parts[1]);
|
|
|
|
$search_module_name = VtUtils::getModuleName($parts[1]);
|
|
#$workflowSettings = $this->getWorkflow()->getSettings();
|
|
|
|
$workflows = $workflows = Workflow2::getWorkflowsForModule($search_module_name, 1);
|
|
$viewer->assign("workflows", $workflows);
|
|
|
|
$fields = VtUtils::getFieldsWithBlocksForModule($search_module_name);
|
|
$viewer->assign("sort_fields", $fields);
|
|
|
|
$moduleObj = \Vtiger_Module_Model::getInstance($search_module_name);
|
|
|
|
$viewer->assign('productCache', array());
|
|
|
|
if($moduleObj instanceof \Inventory_Module_Model) {
|
|
$viewer->assign('searchByProduct', true);
|
|
|
|
$product = $this->get('products');
|
|
if(!empty($product)) {
|
|
//$dataObj = \Vtiger_Record_Model::getInstanceById($product);
|
|
|
|
$productCache[$product] = array(
|
|
'label' => \Vtiger_Functions::getCRMRecordLabel($product),
|
|
);
|
|
$viewer->assign('productCache', $productCache);
|
|
}
|
|
|
|
}
|
|
|
|
$views = array();
|
|
$allviews = \CustomView_Record_Model::getAll($search_module_name);
|
|
foreach($allviews as $view) {
|
|
$views[$view->get('cvid')] = $view->get('viewname');
|
|
}
|
|
|
|
$viewer->assign('customviews', $views);
|
|
}
|
|
|
|
}
|
|
|
|
public function beforeSave(&$data) {
|
|
$data["found_rows"] = preg_replace("/[^0-9]/", "", $data["found_rows"]);
|
|
}
|
|
|
|
} |