vtenext/modules/Settings/ProcessMaker/ProcessMakerEngine.php
2021-04-28 20:10:26 +02:00

1336 lines
60 KiB
PHP

<?php
/*************************************
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
* SPDX-License-Identifier: AGPL-3.0-only
************************************/
/* crmv@92272 crmv@96450 crmv@97566 crmv@108227 crmv@106857 crmv@150751 */
require_once('modules/Settings/ProcessMaker/ProcessMakerUtils.php');
require_once('modules/Settings/ProcessMaker/ProcessDynaForm.php');
class ProcessMakerEngine extends SDKExtendableClass {
var $processid;
var $prev_elementid;
var $elementid;
var $id;
var $entity_id;
var $metaid;
var $process_data;
var $vte_metadata;
var $helper;
var $running_process;
var $log_rollback = false; //crmv@112539
static $processHelper;
function __construct($running_process,$processid,$prev_elementid,$elementid,$id,$metaid,$entityCache) {
global $adb, $table_prefix;
$PMUtils = ProcessMakerUtils::getInstance();
$this->processid = $processid;
$this->prev_elementid = $prev_elementid;
$this->elementid = $elementid;
$this->id = $id;
$this->entity_id = vtws_getIdComponents($id);
$this->entity_id = $this->entity_id[1];
$this->metaid = $metaid;
if (empty($running_process)) {
if ($entityCache::$cache[$id]->moduleName == 'Processes') {
$idComponents = vtws_getIdComponents($id);
$running_process = getSingleFieldValue("{$table_prefix}_processes", 'running_process', 'processesid', $idComponents[1]);
} else {
//$running_process = $this->getRunningProcess();
$running_process = $adb->getUniqueID("{$table_prefix}_running_processes");
}
}
$this->running_process = $running_process;
$xml_version = $PMUtils->getSystemVersion4RunningProcess($this->running_process,array('processmaker','xml_version')); // forced version (xml_version_forced)
$process_data = $PMUtils->retrieve($processid, $xml_version);
$this->process_data = $process_data;
$vte_metadata = Zend_Json::decode($process_data['vte_metadata']);
$helper = Zend_Json::decode($process_data['helper']);
$this->vte_metadata = $vte_metadata[$elementid];
$this->helper = $helper[$elementid];
}
function getEntityCache($wsId='',$dynaformmetaid='') {
global $current_user, $table_prefix;
if (empty($wsId)) {
$crmid = $this->entity_id;
$wsId = $this->id;
} else {
list($m,$crmid) = vtws_getIdComponents($wsId);
}
$PMUtils = ProcessMakerUtils::getInstance();
$entityCache = new VTEntityCache($current_user);
$PMUtils->setDefaultDataFormat();
$entityCache->forId($wsId);
if ($entityCache::$cache[$wsId]->moduleName == 'Processes') {
// add dynaform fields
$processDynaForm = ProcessDynaForm::getInstance();
$focus = CRMEntity::getInstance('Processes');
$focus->id = $crmid;
$focus->column_fields['processmaker'] = $this->processid;
$focus->column_fields['running_process'] = getSingleFieldValue("{$table_prefix}_processes", 'running_process', 'processesid', $crmid);
if (empty($dynaformmetaid)) {
$processDynaForm->getCurrentDynaForm($focus, $elementid);
$meta = $processDynaForm->getMeta($focus->column_fields['processmaker'], $elementid, false, $focus->column_fields['running_process']);
$dynaformmetaid = $meta['id'];
}
$dynaform = $processDynaForm->getValues($focus->column_fields['running_process'], $dynaformmetaid);
if (!empty($dynaform)) $dynaform['crmid'] = $focus->id;
$entityCache::$cache[$wsId]->data = array_merge($entityCache::$cache[$wsId]->data,$dynaform); //crmv@174158
}
$PMUtils->restoreDataFormat();
return $entityCache;
}
//crmv@173186 crmv@176614
function log($title,$str='') {
global $current_user;
static $sid = '';
if (empty($sid)) {
$sid = session_id();
if (empty($sid) && isset($_REQUEST['app_key'])) $sid = 'cron'; else $sid = 'vte';
VTESystemLogger::log('processes', null, str_pad(' '.$sid.' ', 250, '-', STR_PAD_BOTH));
}
$text = "processid:{$this->processid} running_process:{$this->running_process} userid:{$current_user->id} [{$title}] {$str}";
VTESystemLogger::log('processes', null, $text);
}
//crmv@173186e crmv@176614e
function trackRecord($entity_id,$metaid,$prev_elementid,$elementid,$track_update=true) {
global $adb, $table_prefix;
// crmv@129940
$currentCol = 'current';
$adb->format_columns($currentCol);
// crmv@129940e
if ($metaid > 0) { // crmv@102879
$result = $adb->pquery("select * from {$table_prefix}_processmaker_rec where crmid = ? and id = ? and running_process = ?", array($entity_id,$metaid,$this->running_process));
if ($result && $adb->num_rows($result) > 0) {
if ($track_update) {
$adb->pquery("update {$table_prefix}_processmaker_rec set $currentCol = ? where crmid = ? and id = ? and running_process = ?", array($elementid,$entity_id,$metaid,$this->running_process)); // crmv@129940
}
} else {
$adb->pquery("insert into {$table_prefix}_processmaker_rec(crmid,id,running_process,$currentCol) values(?,?,?,?)", array($entity_id,$metaid,$this->running_process,$elementid)); // crmv@129940
}
$this->log("trackRecord","entity_id:$entity_id metaid:$metaid");
} else {
$this->log("editingDynaform","processesid:$entity_id");
}
}
function trackProcess($prev_elementid,$elementid) {
global $adb, $table_prefix;
// crmv@129940
$currentCol = 'current';
$adb->format_columns($currentCol);
$result = $adb->pquery("select $currentCol from {$table_prefix}_running_processes where id = ?", array($this->running_process));
// crmv@129940e
if ($result && $adb->num_rows($result) > 0) {
$current = $adb->query_result($result,0,'current');
if (strpos($current,'|##|') !== false) {
$current = explode('|##|',$current);
if (in_array($elementid,$current)) {
foreach($current as &$el) {
if ($prev_elementid == $el) $el = $elementid;
}
} elseif (in_array($prev_elementid,$current)) {
foreach($current as &$el) {
if ($prev_elementid == $el) $el = $elementid;
}
}
$adb->pquery("update {$table_prefix}_running_processes set $currentCol = ? where id = ?", array(implode('|##|',array_unique($current)),$this->running_process)); // crmv@129940
} else {
$adb->pquery("update {$table_prefix}_running_processes set $currentCol = ? where id = ?", array($elementid,$this->running_process)); // crmv@129940
}
} else {
$adb->pquery("insert into {$table_prefix}_running_processes(id,processmakerid,$currentCol,xml_version) values(?,?,?,?)", array($this->running_process,$this->processid,$elementid,$this->process_data['xml_version'])); // crmv@129940
}
// set last dynaform available
if ($this->helper['active'] == 'on') {
$adb->pquery("update {$table_prefix}_running_processes set current_dynaform = ? where id = ?", array($elementid,$this->running_process));
}
// log running process
$this->logTimeProcess($this->running_process,$this->processid,$prev_elementid,$elementid);
$this->log("trackProcess","$prev_elementid -> $elementid");
}
//crmv@112539
function logTimeProcess($running_process, $processid, $prev_elementid, $elementid) {
global $adb, $table_prefix, $current_user;
$rollback = 0;
if ($this->log_rollback) {
$rollback = 1;
$this->log_rollback = false;
$this->log("Manually changed position");
}
$adb->pquery("insert into {$table_prefix}_running_processes_logs(id,running_process,prev_elementid,elementid,userid,logtime,rollbck) values(?,?,?,?,?,?,?)",
array($adb->getUniqueID("{$table_prefix}_running_processes_logs"), $running_process, $prev_elementid, $elementid, $current_user->id, date('Y-m-d H:i:s'), $rollback));
//crmv@126096
if (!empty($current_user->id)) {
if ($adb->isMysql()) {
$adb->pquery("insert ignore into {$table_prefix}_actor_running_processes(userid,running_process) values(?,?)",array($current_user->id,$running_process));
} else {
$result = $adb->pquery("select * from {$table_prefix}_actor_running_processes where userid = ? and running_process = ?", array($current_user->id,$running_process));
if ($result && $adb->num_rows($result) == 0) {
$adb->pquery("insert into {$table_prefix}_actor_running_processes(userid,running_process) values(?,?)",array($current_user->id,$running_process));
}
}
}
//crmv@126096e
}
function logElement($elementid, $info) {
global $adb, $table_prefix;
$adb->pquery("insert into {$table_prefix}_running_processes_logsi(id,running_process,elementid,info) values(?,?,?,?)",
array($adb->getUniqueID("{$table_prefix}_running_processes_logsi"), $this->running_process, $elementid, Zend_Json::encode($info)));
}
//crmv@112539e
function execute($engineType,$bpmnType) {
$method = "execute{$engineType}";
//echo "execute $method($bpmnType) $this->entity_id,$this->metaid,$this->processid,$this->prev_elementid,$this->elementid,$bpmnType,$this->running_process<br>\n";
if ($engineType != '' && method_exists($this,$method)) {
$this->$method($bpmnType);
} else {
// if the bpmn element is not implemented go to next steps
$this->trackProcess($this->prev_elementid,$this->elementid);
// execute next steps
$this->executeNextSteps();
}
}
function executeNextSteps() {
$PMUtils = ProcessMakerUtils::getInstance();
$outgoings = $PMUtils->getOutgoing($this->processid,$this->elementid,$this->running_process);
if (!empty($outgoings)) {
foreach($outgoings as $outgoing) {
$entityCache = $this->getEntityCache();
$nextPMEngine = ProcessMakerEngine::getInstance($this->running_process,$this->processid,$this->elementid,$outgoing['shape']['id'],$this->id,$this->metaid,$entityCache);
$nextPMEngine->execute($PMUtils->getEngineType($outgoing['shape']),$outgoing['shape']['type']);
}
}
}
function executeCondition($bpmnType) {
$this->trackProcess($this->prev_elementid,$this->elementid);
// crmv@OPER16448
if (empty($this->entity_id)) {
$this->log("ERROR","entity_id is empty");
return false;
}
$module = getSalesEntityType($this->entity_id,true);
if (empty($this->entity_id)) {
$this->log("ERROR","module not found");
return false;
}
// crmv@OPER16448e
$focus = CRMEntity::getInstance($module);
// crmv@168055 crmv@173270
$error = $focus->retrieve_entity_info_no_html($this->entity_id,$module,false);
if (!empty($error)) {
$this->log("ERROR","retrieve_entity_info_no_html({$this->entity_id},{$module}): {$error}");
return false;
}
// crmv@168055e crmv@173270e
$focus->mode = 'edit';
require_once("include/events/include.inc");
require_once("modules/Settings/ProcessMaker/ProcessMakerHandler.php");
$em = new VTEventsManager($adb);
// Initialize Event trigger cache
$em->initTriggerCache();
$entityData = VTEntityData::fromCRMEntity($focus);
$processMakerHandler = new ProcessMakerHandler();
$processMakerHandler->real_save = false;
if ($this->isParallelCondition($this->running_process, $this->elementid)) $processMakerHandler->parallel_current_info = array('running_process'=>$this->running_process, 'elementid'=>$this->elementid); //crmv@115579
$processMakerHandler->handleEvent('vte.entity.aftersave.processes', $entityData); // crmv@177677 crmv@207852
}
function executeAction($bpmnType) {
global $adb, $table_prefix;
$this->trackProcess($this->prev_elementid,$this->elementid);
$processHelper = $this->queueProcessHelper();
//crmv@135193
$PMUtils = ProcessMakerUtils::getInstance();
if ($PMUtils->skip_notifications_actions) {
global $global_skip_notifications;
$tmp_global_skip_notifications = $global_skip_notifications;
$global_skip_notifications = true;
}
if ($PMUtils->hide_changelog) {
global $global_hide_changelog;
$tmp_global_hide_changelog = $global_hide_changelog;
$global_hide_changelog = true;
}
//crmv@135193e
// execute all actions
$actions = $this->vte_metadata['actions'];
if (!empty($actions)) {
foreach($actions as $actionid => $action) {
if ($action['action_type'] == 'SDK') {
$sdkActions = SDK::getProcessMakerActions();
$sdkAction = $sdkActions[$action['function']];
if (!empty($sdkAction)) {
require_once($sdkAction['src']);
call_user_func_array($sdkAction['funct'], array($this,$actionid));
}
} else {
require_once("modules/Settings/ProcessMaker/actions/{$action['action_type']}.php");
$actionClass = 'PMAction'.$action['action_type'];
$actionObj = new $actionClass;
$actionObj->execute($this,$actionid);
}
}
}
$global_skip_notifications = $tmp_global_skip_notifications; //crmv@135193
$processEnded = $this->isEndProcess($bpmnType);
//crmv@103534 kill parallels fake processes
if ($processEnded) {
$result = $adb->pquery("select processesid, elementid from {$table_prefix}_process_gateway_conn where running_process = ? and casperid <> processesid and casperid is not null", array($this->running_process));
if ($result && $adb->num_rows($result) > 0) {
$focus = CRMEntity::getInstance('Processes');
while($row=$adb->fetchByAssoc($result)) {
$focus->trash('Processes',$row['processesid']);
}
$adb->pquery("delete from {$table_prefix}_process_gateway_conn where running_process = ?", array($this->running_process));
}
}
//crmv@103534e
$this->saveProcessHelper($processHelper);
$global_hide_changelog = $tmp_global_hide_changelog; //crmv@135193
$this->applyAdvancedPermissions(); //crmv@100731 apply advanced permissions
$this->applyConditionals($processEnded); //crmv@112297
// execute next steps
$this->executeNextSteps();
if ($processEnded) {
$this->endProcess();
}
}
//crmv@100731
function applyAdvancedPermissions() {
global $adb, $table_prefix;
$adv_perm_tmp = array();
$advanced_permissions = $this->vte_metadata['advanced_permissions'];
if (!empty($advanced_permissions)) {
foreach($advanced_permissions as $advanced_permission) {
list($metaid,$module) = explode(':',$advanced_permission['record_involved']);
$record_involved = $this->getCrmid($metaid);
$resource = $this->getResource($advanced_permission['resource']);
if (!empty($resource)) {
$read_perm = 0;
$write_perm = 0;
if (in_array($advanced_permission['permission'],array('ro','rw'))) $read_perm = 1;
if ($advanced_permission['permission'] == 'rw') $write_perm = 1;
// if I have more rows for the same record/resource use the most restrictive condition
if (!isset($adv_perm_tmp[$record_involved][$resource]) || $read_perm < $adv_perm_tmp[$record_involved][$resource]['read_perm'] || $write_perm < $adv_perm_tmp[$record_involved][$resource]['write_perm'])
$adv_perm_tmp[$record_involved][$resource] = array('read_perm'=>$read_perm,'write_perm'=>$write_perm,'resource_type'=>$advanced_permission['resource_type']);
}
}
}
/*
// apply permission from $this->elementid to the next action task
$this->setPermissionRecursively($this->processid,$this->running_process,$this->elementid,$adv_perm_tmp);
*/
// the permission is valid until another permission is registered for the same crmid and user
foreach($adv_perm_tmp as $crmid => $tmp) {
foreach($tmp as $resource => $perm) {
$this->log("Set Advanced Permissions","entity_id:{$crmid} resource:{$resource} read:{$perm['read_perm']} write:{$perm['write_perm']}");
$adb->pquery("delete from {$table_prefix}_process_adv_permissions where running_process = ? and crmid = ? and resource = ?", array($this->running_process,$crmid,$resource));
$adb->pquery("insert into {$table_prefix}_process_adv_permissions (running_process,crmid,resource,resource_type,elementid,read_perm,write_perm) values (?,?,?,?,?,?,?)",
array($this->running_process,$crmid,$resource,$perm['resource_type'],$this->elementid,$perm['read_perm'],$perm['write_perm']));
}
}
}
/*
function setPermissionRecursively($processid,$running_process,$elementid,$adv_perm_tmp) {
global $adb, $table_prefix;
foreach($adv_perm_tmp as $crmid => $tmp) {
foreach($tmp as $resource => $perm) {
$adb->pquery("delete from {$table_prefix}_process_adv_permissions where running_process = ? and elementid = ?", array($this->running_process,$elementid));
$adb->pquery("insert into {$table_prefix}_process_adv_permissions (running_process,elementid,crmid,resource,read_perm,write_perm) values (?,?,?,?,?,?)",
array($running_process,$elementid,$crmid,$resource,$perm['read_perm'],$perm['write_perm']));
}
}
$PMUtils = ProcessMakerUtils::getInstance();
$outgoings = $PMUtils->getOutgoing($processid,$elementid,$running_process);
if (!empty($outgoings)) {
foreach($outgoings as $outgoing) {
$engineType = $PMUtils->getEngineType($outgoing['shape']);
if ($engineType == 'Action') continue;
else $this->setPermissionRecursively($processid,$running_process,$outgoing['shape']['id'],$adv_perm_tmp);
}
}
} */
//crmv@100731e
//crmv@112297
function applyConditionals($processEnded) {
global $adb, $table_prefix;
if ($processEnded) {
// if process is ended delete all conditionals and win conditionals defined in the End-Task or the standard ones
$adb->pquery("delete from {$table_prefix}_processmaker_conditionals where running_process = ?", array($this->running_process));
}
$conditionals = $this->vte_metadata['conditionals'];
if (!empty($conditionals)) {
foreach($conditionals as $conditional) {
list($metaid,$module) = explode(':',$conditional['moduleName']);
$crmid = $this->getCrmid($metaid,$this->running_process);
// clean previous rules applied to that crmid
$adb->pquery("delete from {$table_prefix}_processmaker_conditionals where running_process = ? and crmid = ?", array($this->running_process,$crmid));
// save only the elementid in whitch are saved the advanced conditionals and retrieve them later
$result = $adb->pquery("select * from {$table_prefix}_processmaker_conditionals where running_process = ? and crmid = ? and elementid = ?", array($this->running_process,$crmid,$this->elementid));
if ($result && $adb->num_rows($result) > 0) {}
else $adb->pquery("insert into {$table_prefix}_processmaker_conditionals(id,running_process,crmid,elementid) values(?,?,?,?)", array($adb->getUniqueID("{$table_prefix}_processmaker_conditionals"),$this->running_process,$crmid,$this->elementid));
}
}
}
//crmv@112297e
function executeGateway($bpmnType) {
global $adb, $table_prefix;
$this->trackProcess($this->prev_elementid,$this->elementid);
$PMUtils = ProcessMakerUtils::getInstance();
if ($bpmnType == 'ParallelGateway') {
// clear required2go
$closing_gateway = $this->vte_metadata['closing_gateway'];
if (!empty($closing_gateway)) $adb->pquery("delete from {$table_prefix}_process_gateway_req where running_process = ? and gateway_elementid = ?", array($this->running_process,$closing_gateway));
//crmv@149014 crmv@185647 TODO manage also nested parallel gateways
$result = $adb->pquery("select processesid from {$table_prefix}_processes where deleted = 0 and running_process = ?", array($this->running_process));
if ($result && $adb->num_rows($result) > 0) $primary_processesid = $adb->query_result($result,0,'processesid');
//crmv@149014e crmv@185647e
$outgoings = $PMUtils->getOutgoing($this->processid,$this->elementid,$this->running_process);
if (!empty($outgoings)) {
$next = array();
foreach($outgoings as $seq => $outgoing) {
$next[] = $outgoing['shape']['id'];
//crmv@103534 crmv@115579
$elementsons = array();
$conditionssons = array();
$PMUtils->getParallelFlowSons($this->processid,$this->running_process,$this->elementid,$outgoing['shape']['id'],$elementsons,$conditionssons);
$elementsons = Zend_Json::encode($elementsons);
$conditionssons = Zend_Json::encode($conditionssons);
$adb->pquery("delete from {$table_prefix}_process_gateway_conn where running_process = ? and elementid = ? and flow = ?", array($this->running_process,$this->elementid,$outgoing['connection']['id']));
$adb->pquery("insert into {$table_prefix}_process_gateway_conn(running_process,elementid,flow,seq,bpmn_type,elementsons,conditionssons,primary_processesid) values(?,?,?,?,?,?,?,?)", array($this->running_process,$this->elementid,$outgoing['connection']['id'],$seq,$bpmnType,$elementsons,$conditionssons,$primary_processesid)); //crmv@149014
//crmv@103534e crmv@115579e
}
$this->trackProcess($this->elementid,implode('|##|',$next));
}
} else {
$gatewayConditions = $PMUtils->getGatewayConditions($this->processid,$this->elementid,$this->vte_metadata,$show_required2go_check=false,$this->running_process);
// check current condition
$required2go_all = $this->vte_metadata['required2go'];
$required2go = array();
if (!empty($gatewayConditions)) {
$next = false;
foreach($gatewayConditions as $gatewayCondition) {
if ($required2go_all == 'on' && isset($gatewayCondition['elementid'])) {
$required2go[] = $gatewayCondition['elementid'];
}
if ($this->prev_elementid == $gatewayCondition['elementid']) {
if (!empty($gatewayCondition['conditions'])) {
$wsId = $this->id;
$cond_metaid = '';
if (!empty($gatewayCondition['metaid'])) {
//crmv@160805
if ($PMUtils->isStartTask($this->processid,$gatewayCondition['elementid'],$this->running_process)) {
$cond_module = $gatewayCondition['metaid'];
$metaRec = $PMUtils->getMetaRecords($this->processid,$gatewayCondition['elementid'],$this->running_process);
$cond_metaid = $metaRec[$gatewayCondition['elementid']]['id'];
} else {
list($cond_metaid,$cond_module) = explode(':',$gatewayCondition['metaid']);
}
//crmv@160805e
$running_process = $this->running_process;
if ($cond_module == 'DynaForm') {
$cond_module = 'Processes';
$processDynaFormObj = ProcessDynaForm::getInstance();
// processo principale
$crmid = $processDynaFormObj->getProcessesId($this->running_process,$cond_metaid);
// verifico se sono in un parallelo
$result_g = $adb->pquery("select processesid from {$table_prefix}_process_gateway_conn where running_process = ? and (processesid = ? or casperid = ?) and conditionssons like '%\"".$gatewayCondition['elementid']."\"%'", array($this->running_process,$crmid,$crmid));
if ($result_g && $adb->num_rows($result_g) > 0) $crmid = $adb->query_result($result_g,0,'processesid');
} else {
$crmid = ProcessMakerEngine::getCrmid($cond_metaid,$this->running_process);
}
$wsId = vtws_getWebserviceEntityId($cond_module, $crmid);
}
$entityCache = $this->getEntityCache($wsId,$cond_metaid);
foreach($gatewayCondition['conditions'] as $condition) {
$cond = Zend_Json::encode(array(array('conditions'=>Zend_Json::decode($condition['json_condition']))));
if ($PMUtils->evaluateCondition($entityCache, $wsId, $cond)) {
$next = $condition['elementid'];
break;
}
}
// else
if ($next === false && $this->vte_metadata['cond_else'] != '') {
$next = $this->vte_metadata['cond_else'];
}
}
}
}
}
if (!empty($required2go) && $next !== false) {
$this->setGatewayRequired($this->elementid,$this->prev_elementid,$next);
$requiredCheck = $this->getGatewayRequired($this->elementid);
foreach($required2go as $el) {
if (!isset($requiredCheck[$el])) {
$next = false;
break;
}
}
}
}
if (!empty($next)) {
//crmv@103534 kill parallels fake processes
$result = $adb->pquery("select distinct elementid from {$table_prefix}_process_gateway_conn where running_process = ?", array($this->running_process));
if ($result && $adb->num_rows($result) > 0) {
$change_entity = false;
$vte_metadata = Zend_Json::decode($this->process_data['vte_metadata']);
while($row=$adb->fetchByAssoc($result)) {
$elementid = $row['elementid'];
if ($vte_metadata[$elementid]['closing_gateway'] == $this->elementid) {
//crmv@149014
$result1 = $adb->pquery("select processesid from {$table_prefix}_process_gateway_conn where running_process = ? and elementid = ? and casperid is not null", array($this->running_process,$elementid));
if ($result1 && $adb->num_rows($result1) > 0) {
$focus = CRMEntity::getInstance('Processes');
while($row1=$adb->fetchByAssoc($result1)) {
$focus->trash('Processes',$row1['processesid']);
if ($row1['processesid'] == $this->entity_id) $change_entity = true;
}
}
//crmv@149014e
// query spostata fuori dall'if in modo da svuotare tutta la coda sempre
$adb->pquery("delete from {$table_prefix}_process_gateway_conn where running_process = ? and elementid = ?", array($this->running_process,$elementid));
}
}
if ($change_entity) {
// select another Processes not deleted
$result = $adb->limitpQuery("SELECT processesid FROM {$table_prefix}_processes WHERE deleted = 0 AND processmaker = ? AND running_process = ? ORDER BY processesid", 0, 1, array($this->processid, $this->running_process)); //crmv@185647
if ($result && $adb->num_rows($result) > 0) {
$this->entity_id = $adb->query_result($result,0,'processesid');
$webserviceObject = VtenextWebserviceObject::fromName($adb,'Processes');//crmv@207871
$this->id = vtws_getId($webserviceObject->getEntityId(),$this->entity_id);
}
}
}
//crmv@103534e
if (!is_array($next)) $next = array($next);
foreach($next as $n) {
$structure = $PMUtils->getStructure($this->processid,$this->running_process);
$engineType = $PMUtils->getEngineType($structure['shapes'][$n]);
$entityCache = $this->getEntityCache();
$nextPMEngine = ProcessMakerEngine::getInstance($this->running_process,$this->processid,$this->elementid,$n,$this->id,$this->metaid,$entityCache);
$nextPMEngine->execute($engineType,$structure['shapes'][$n]['type']);
}
}
}
function executeTimerIntermediate($bpmnType) {
global $adb, $table_prefix;
$PMUtils = ProcessMakerUtils::getInstance();
// check if the timer is already registered
// crmv@181433
$occurrence = 0;
if ($PMUtils->checkTimerExists('intermediate',$this->running_process,$this->prev_elementid,$this->elementid,$occurrence)) return;
// crmv@181433e
$this->trackProcess($this->prev_elementid,$this->elementid);
//crmv@182148
$datetime = 'now';
if ($this->vte_metadata['trigger_date_type'] == 'date' && !empty($this->vte_metadata['trigger_date_value'])) {
$datetime = $this->vte_metadata['trigger_date_value'];
if (!empty($this->vte_metadata['trigger_hour_value'])) $datetime .= ' '.$this->vte_metadata['trigger_hour_value'];
} elseif ($this->vte_metadata['trigger_date_type'] == 'other') {
$datetime = $this->replaceTags('trigger_other_value',$this->vte_metadata['trigger_other_value'],array(),array());
}
$delay = new DateTime($datetime);
$interval = 'P'.intval($this->vte_metadata['months']).'M'.intval($this->vte_metadata['days']).'D'.'T'.intval($this->vte_metadata['hours']).'H'.intval($this->vte_metadata['min']).'M'; //crmv@179893
$dateInterval = new DateInterval($interval);
if ($this->vte_metadata['trigger_direction'] == 'before') {
$delay->sub($dateInterval);
} else {
$delay->add($dateInterval);
}
$timer_delay = $delay->format('Y-m-d H:i:s');
//crmv@182148e
//init id and metaid
if (empty($this->id)) {
// if next element is a condition use the record used there
$outgoings = $PMUtils->getOutgoing($this->processid,$this->elementid,$this->running_process);
if (!empty($outgoings)) {
$outgoing = $outgoings[0];
$entityCache = $this->getEntityCache();
$nextPMEngine = ProcessMakerEngine::getInstance($this->running_process,$this->processid,$this->elementid,$outgoing['shape']['id'],$this->id,$this->metaid,$entityCache);
if ($PMUtils->getEngineType($outgoing['shape']) == 'Condition') {
$metadata = $PMUtils->getMetadata($this->processid,$outgoing['shape']['id'],$this->running_process);
if (strpos($metadata['moduleName'],':') !== false) {
list($metaid,$moduleName) = explode(':',$metadata['moduleName']);
}
}
}
if (!empty($metaid)) {
$result = $adb->pquery("SELECT * FROM {$table_prefix}_processmaker_rec WHERE running_process = ? and id = ? ORDER BY id, crmid DESC", array($this->running_process,$metaid));
if ($result && $adb->num_rows($result) > 0) {
$crmid = $adb->query_result($result,0,'crmid');
$webserviceObject = VtenextWebserviceObject::fromName($adb,getSalesEntityType($crmid,true));//crmv@207871
$this->id = vtws_getId($webserviceObject->getEntityId(),$crmid);
$this->metaid = $adb->query_result($result,0,'id');
}
} else {
// else choose last rec created
$result = $adb->pquery("SELECT * FROM {$table_prefix}_processmaker_rec WHERE running_process = ? ORDER BY id, crmid DESC", array($this->running_process));
if ($result && $adb->num_rows($result) > 0) {
$crmid = $adb->query_result($result,0,'crmid');
$webserviceObject = VtenextWebserviceObject::fromName($adb,getSalesEntityType($crmid,true));//crmv@207871
$this->id = vtws_getId($webserviceObject->getEntityId(),$crmid);
$this->metaid = $adb->query_result($result,0,'id');
}
}
}
$info = array('processid'=>$this->processid,'prev_elementid'=>$this->prev_elementid,'elementid'=>$this->elementid,'id'=>$this->id,'metaid'=>$this->metaid,'running_process'=>$this->running_process);
$PMUtils->createTimer('intermediate',$timer_delay,$this->running_process,$this->prev_elementid,$this->elementid,'',$info); //crmv@127048
$this->log("Set Timer Delay","interval:{$interval} datetime:$timer_delay");
}
function executeTimerBoundaryInterr($bpmnType) {
$this->executeTimerBoundary($bpmnType,true);
}
function executeTimerBoundaryNonInterr($bpmnType) {
$this->executeTimerBoundary($bpmnType,false);
}
function executeTimerBoundary($bpmnType, $cancelActivity) {
global $adb, $table_prefix;
$PMUtils = ProcessMakerUtils::getInstance();
// check if the timer is already registered
//crmv@105312
$occurrence = 0;
if ($PMUtils->checkTimerExists('boundary',$this->running_process,$this->prev_elementid,$this->elementid,$occurrence)) return;
//crmv@105312e
$delay = new DateTime();
$interval = 'P'.intval($this->vte_metadata['months']).'M'.intval($this->vte_metadata['days']).'D'.'T'.intval($this->vte_metadata['hours']).'H'.intval($this->vte_metadata['min']).'M'; //crmv@179893
$delay->add(new DateInterval($interval));
$timer_delay = $delay->format('Y-m-d H:i:s');
$info = array('processid'=>$this->processid,'prev_elementid'=>$this->prev_elementid,'elementid'=>$this->elementid,'id'=>$this->id,'metaid'=>$this->metaid,'running_process'=>$this->running_process,'cancelActivity'=>$cancelActivity);
$PMUtils->createTimer('boundary',$timer_delay,$this->running_process,$this->prev_elementid,$this->elementid,$occurrence,$info); //crmv@105312
$this->log("Set Timer Boundary","interval:{$interval} datetime:$timer_delay");
}
//crmv@97575
function executeSubProcess($bpmnType) {
global $adb, $table_prefix;
$PMUtils = ProcessMakerUtils::getInstance();
$this->trackProcess($this->prev_elementid,$this->elementid);
if (!empty($this->vte_metadata['subprocess'])) {
$events = $PMUtils->getStartingEvents(false,'',$this->vte_metadata['subprocess']);
$event = $events[0];
$running_process = $event['running_process'];
$processid = $event['processid'];
$elementid = $event['elementid'];
$incoming = $PMUtils->getIncoming($processid,$elementid,$running_process); //crmv@160368
(!empty($incoming)) ? $current_elementid = $incoming[0]['shape']['id'] : $current_elementid = false;
$structure = $PMUtils->getStructure($processid,$running_process);
$engineType = $PMUtils->getEngineType($structure['shapes'][$elementid]);
if ($engineType == 'Condition' && $event['metadata']['execution_condition'] == 'ON_SUBPROCESS') {
// if the start element is a condition execute next elements of the condition
$entityCache = $this->getEntityCache();
$PMEngine = ProcessMakerEngine::getInstance($running_process,$processid,$current_elementid,$elementid,$this->id,$event['metaid'],$entityCache);
ProcessMakerHandler::$running_processes[] = array('new'=>true,'running_process'=>$PMEngine->running_process,'processid'=>$processid,'record'=>$this->entity_id,'metaid'=>$event['metaid']);
//crmv@161211
if ($PMUtils->getRunningProcess($this->entity_id,$this->metaid,$this->processid) != $this->running_process) {
ProcessMakerHandler::$running_processes[] = array('new'=>false,'running_process'=>$this->running_process,'processid'=>$this->processid,'record'=>$this->entity_id,'metaid'=>$this->metaid);
}
//crmv@161211e
$PMEngine->trackProcess($current_elementid,$elementid);
$PMEngine->executeNextSteps();
} elseif ($engineType == 'Action') {
// if the start element is an action execute it
$entityCache = $this->getEntityCache();
$PMEngine = ProcessMakerEngine::getInstance($running_process,$processid,$current_elementid,$elementid,$this->id,$event['metaid'],$entityCache);
ProcessMakerHandler::$running_processes[] = array('new'=>true,'running_process'=>$PMEngine->running_process,'processid'=>$processid,'record'=>$this->entity_id,'metaid'=>$event['metaid']);
//crmv@161211
if ($PMUtils->getRunningProcess($this->entity_id,$this->metaid,$this->processid) != $this->running_process) {
ProcessMakerHandler::$running_processes[] = array('new'=>false,'running_process'=>$this->running_process,'processid'=>$this->processid,'record'=>$this->entity_id,'metaid'=>$this->metaid);
}
//crmv@161211e
$PMEngine->execute($engineType,$structure['shapes'][$elementid]['type']);
}
}
// execute next steps
$this->executeNextSteps();
}
//crmv@97575e
function getRunningProcess() {
global $adb, $table_prefix;
$PMUtils = ProcessMakerUtils::getInstance();
$running_process = $PMUtils->getRunningProcess($this->entity_id,$this->metaid,$this->processid);
if ($running_process === false) {
$running_process = $adb->getUniqueID("{$table_prefix}_running_processes");
}
return $running_process;
}
function queueProcessHelper() {
$process_helper = array();
if ($this->helper['active'] == 'on') {
if ($this->helper['assigned_user_id'] != '') $process_helper['assigned_user_id'] = $this->helper['assigned_user_id'];
if ($this->helper['sdk_params_assigned_user_id'] != '') $process_helper['sdk_params_assigned_user_id'] = $this->helper['sdk_params_assigned_user_id']; //crmv@113527
if ($this->helper['description'] != '') $process_helper['requested_action'] = $this->helper['description'];
if ($this->helper['related_to'] != '') $process_helper['related_to'] = $this->helper['related_to'];
if ($this->helper['process_status'] != '') $process_helper['process_status'] = $this->helper['process_status']; //crmv@103450
if ($this->helper['process_name_mass_edit_check'] == 'on' && $this->helper['process_name'] != '') $process_helper['process_name'] = $this->helper['process_name']; //crmv@109685
if (!empty($process_helper)) {
$process_helper['processmaker'] = $this->processid;
$process_helper['running_process'] = $this->running_process;
if (empty($process_helper['process_name'])) $process_helper['process_name'] = $this->process_data['name']; //crmv@109685
}
}
return $process_helper;
}
//crmv@103534
function saveProcessHelper($processHelper) {
global $adb, $table_prefix, $current_user;
if (!empty($processHelper)) {
//crmv@135193: check skip_notifications flag
$PMUtils = ProcessMakerUtils::getInstance();
if ($PMUtils->skip_notifications_helper) {
global $global_skip_notifications;
$tmp_global_skip_notifications = $global_skip_notifications;
$global_skip_notifications = true;
}
//crmv@135193e
// check if I am in a parallel flow
$primary = true;
$processesid = false;
$parallel = false;
$result = $adb->pquery("select * from {$table_prefix}_process_gateway_conn where running_process = ? order by seq", array($this->running_process));
if ($result && $adb->num_rows($result) > 0) {
// foreach flow there is a different process: a primary and the others phantoms of the primary
while($row=$adb->fetchByAssoc($result,-1,false)) {
$seq = $row['seq'];
$gateway = $row['elementid'];
$flow = $row['flow'];
$elementsons = Zend_Json::decode($row['elementsons']);
if (in_array($this->elementid,$elementsons)) {
$parallel = true;
$processesid = $row['processesid'];
//crmv@149014
$checkPrimary = $adb->pquery("select processesid from {$table_prefix}_process_gateway_conn where running_process = ? and elementid = ? and processesid is not null", array($this->running_process,$gateway));
if ($checkPrimary && $adb->num_rows($checkPrimary) == 0 && !empty($row['primary_processesid'])) {
// se tutte le righe della _process_gateway_conn hanno processesid vuoto allora il primo ramo che viene eseguito diventa il primary
$primary = true;
$processesid = $row['primary_processesid'];
} elseif (empty($row['primary_processesid']) || $row['primary_processesid'] == $processesid) {
// se non esiste un processo prima di entrare nel parallelo allora il primo ramo che ne crea un processhelper diventa il primary
$primary = true;
//crmv@149014e
} else {
$primary = false;
$casperid = $row['casperid'];
if (empty($casperid)) {
$resultCasper = $adb->pquery("select processesid from {$table_prefix}_process_gateway_conn where running_process = ? and elementid = ? and processesid is not null order by seq", array($this->running_process,$gateway));
if ($resultCasper && $adb->num_rows($resultCasper) > 0) {
$casperid = $adb->query_result($resultCasper,0,'processesid');
}
}
}
break;
}
}
}
if ($primary && empty($processesid)) {
// search if I am inside to another parallel flow
if ($parallel) {
$PMUtils = ProcessMakerUtils::getInstance();
$processesid = $PMUtils->searchParentParallelFlow($this->running_process,$gateway);
}
if (empty($processesid)) {
$result = $adb->pquery("select processesid from {$table_prefix}_processes where deleted = 0 and running_process = ? order by processesid", array($this->running_process)); //crmv@185647
if ($result && $adb->num_rows($result) > 0) {
$processesid = $adb->query_result($result,0,'processesid');
}
}
}
$request = $_REQUEST; $_REQUEST = array(); // preserve request
$focus = CRMEntity::getInstance('Processes');
if (!empty($processesid)) {
$focus->retrieve_entity_info_no_html($processesid,'Processes');
$focus->mode = 'edit';
unset($processHelper['processmaker']);
unset($processHelper['running_process']);
} else {
// in create force assigned_user_id if empty
if (empty($processHelper['assigned_user_id'])) {
$processHelper['assigned_user_id'] = $current_user->id;
}
}
foreach($processHelper as $fieldname => $value) {
if ($fieldname == 'related_to') {
//crmv@135190 crmv@160843
if (strpos($value,'$') === 0) {
$crmid = $this->replaceTags($fieldname,$value,array('related_to'),array());
} else {
list($metaid,$module,$reference) = explode(':',$value);
if (!empty($reference)) {
$crmid = $this->getCrmid($metaid,null,$reference);
if ($crmid === false) $crmid = $this->getCrmid($metaid);
} else {
$crmid = $this->getCrmid($metaid);
}
}
//crmv@135190e crmv@160843e
if ($crmid !== false) $value = $crmid;
} elseif ($fieldname == 'assigned_user_id') {
$value = $this->getResource($value);
//crmv@109685
} elseif (in_array($fieldname,array('process_name','requested_action'))) {
$value = $this->replaceTags($fieldname,$value,array(),array());
//crmv@109685e
}
$focus->column_fields[$fieldname] = $value;
}
$focus->engine = $this;
$focus->parallel = $parallel;
$focus->primary = $primary;
$focus->casperid = $casperid;
$focus->gateway = $gateway;
$focus->flow = $flow;
$focus->save('Processes');
//crmv@149014
$processesid = $focus->id;
if ($primary && !empty($gateway)) {
$query = "update {$table_prefix}_process_gateway_conn set primary_processesid = ? where running_process = ? and elementid = ?";
$adb->pquery($query,array($processesid,$this->running_process,$gateway));
}
//crmv@149014e
$_REQUEST = $request; // restore request
//crmv@135193: restore skip_notifications flag
$global_skip_notifications = $tmp_global_skip_notifications;
//crmv@135193e
}
}
function isEndProcess($bpmnType) {
global $adb, $table_prefix;
$ended = false;
$PMUtils = ProcessMakerUtils::getInstance();
if ($PMUtils->isEndTask($bpmnType)) {
// crmv@129940
$currentCol = 'current';
$adb->format_columns($currentCol);
$result = $adb->pquery("select $currentCol from {$table_prefix}_running_processes where id = ?", array($this->running_process));
// crmv@129940e
if ($result && $adb->num_rows($result) > 0) {
$current = $adb->query_result($result,0,'current');
if (strpos($current,'|##|') !== false) {
$current = explode('|##|',$current);
$PMUtils = ProcessMakerUtils::getInstance();
$structure = $PMUtils->getStructure($this->processid,$this->running_process);
foreach($current as $elementid) {
$bpmnType = $PMUtils->formatType($structure['shapes'][$elementid]['type']);
if ($PMUtils->isEndTask($bpmnType)) {
$ended = true;
} else {
$ended = false;
break;
}
}
} else {
$ended = true;
}
}
}
return $ended;
}
//crmv@112539
function endProcess($end=1) {
global $adb, $table_prefix;
// crmv@129940
$endCol = 'end';
$adb->format_columns($endCol);
$adb->pquery("update {$table_prefix}_running_processes set $endCol = ? where id = ?", array($end,$this->running_process));
// crmv@129940e
if ($end == 1) {
//$adb->pquery("delete from {$table_prefix}_process_adv_permissions where running_process = ? and elementid <> ?", array($this->running_process,$current)); ////crmv@100731 TODO check for parallels
//crmv@178000
$PMUtils = ProcessMakerUtils::getInstance();
$PMUtils->deleteTimer('boundary',$this->running_process);
$PMUtils->deleteTimer('intermediate',$this->running_process);
//crmv@178000e
$this->log("End Process");
} else {
$this->log("Process re-started");
}
}
function activateProcess($mode=true) {
global $adb, $table_prefix;
$adb->pquery("update {$table_prefix}_running_processes set active = ? where id = ?", array(($mode)?1:0,$this->running_process));
if ($mode) {
$this->log("Activate Process");
} else {
$this->log("Disactivate Process");
}
}
//crmv@112539e
//crmv@135190 crmv@160368
function getCrmid($metaid,$running_process='',$fieldid='',$meta_processid='') {
global $adb, $table_prefix;
if (empty($running_process) && isset($this)) $running_process = $this->running_process; //crmv@159135 only if you call getCrmid as method
if (!empty($meta_processid)) {
$result = $adb->pquery("select father from {$table_prefix}_running_processes where id = ? and father is not null and father <> ''", array($running_process));
if ($result && $adb->num_rows($result) > 0) {
$running_process = $adb->query_result($result,0,'father');
}
}
if (!empty($running_process)) {
$result = $adb->limitpQuery("select crmid from {$table_prefix}_processmaker_rec where id = ? and running_process = ? order by crmid desc", 0, 1, array($metaid,$running_process)); //crmv@105312
if ($result && $adb->num_rows($result) > 0) {
$crmid = $adb->query_result($result,0,'crmid');
if (!empty($fieldid)) {
$result1 = $adb->pquery("select columnname, tablename, {$table_prefix}_tab.name from {$table_prefix}_field inner join {$table_prefix}_tab on {$table_prefix}_tab.tabid = {$table_prefix}_field.tabid where fieldid = ?", array($fieldid));
if ($result1 && $adb->num_rows($result1) > 0) {
$tablename = $adb->query_result($result1,0,'tablename');
$columnname = $adb->query_result($result1,0,'columnname');
$focus = CRMEntity::getInstance($adb->query_result($result1,0,'name'));
$related = getSingleFieldValue($tablename, $columnname, $focus->tab_name_index[$tablename], $crmid);
if (empty($related))
return false;
else
return $related;
}
}
return $crmid;
}
}
return false;
}
//crmv@135190e crmv@160368e
function getResource($value) {
if (!is_numeric($value)) {
$PMUtils = ProcessMakerUtils::getInstance();
if (strpos($value,':') == 3) { // old mode
list($meta_processid,$metaid,$module,$user_fieldname) = explode(':',$value);
$meta_processid = str_replace('$', '', $meta_processid); //crmv@206002
(empty($meta_processid)) ? $running_process = '' : $running_process = $PMUtils->getRelatedRunningProcess($this->running_process,$this->processid,$meta_processid);
$crmid = $this->getCrmid($metaid,$running_process);
//crmv@206002
if($module === null){
$module = getSalesEntityType($this->entity_id,true);
}
//crmv@206002e
if ($crmid !== false) {
$entityFocus = CRMEntity::getInstance($module);
$entityFocus->retrieve_entity_info($crmid,$module);
$value = $entityFocus->column_fields[$user_fieldname];
}
} else {
$value = $this->replaceTags('assigned_user_id',$value,array(),array('assigned_user_id'));
}
}
return $value;
}
function setGatewayRequired($gateway_elementid,$prev_elementid,$next_elementid) {
global $adb, $table_prefix;
$adb->pquery("insert ignore into {$table_prefix}_process_gateway_req values (?,?,?,?)", array($this->running_process,$gateway_elementid,$prev_elementid,$next_elementid));
}
function getGatewayRequired($gateway_elementid) {
global $adb, $table_prefix;
$return = array();
$result = $adb->pquery("select prev_elementid, next_elementid from {$table_prefix}_process_gateway_req where running_process = ? and gateway_elementid = ?", array($this->running_process,$gateway_elementid));
if ($result && $adb->num_rows($result) > 0) {
while($row=$adb->fetchByASsoc($result)) {
$return[$row['prev_elementid']] = $row['next_elementid'];
}
}
return $return;
}
// crmv@102879
function replaceTags($fieldname,$value,$referenceFields,$ownerFields,$actionid=false,$cycleIndex=null,$advanced_field_condition=false,$prepareValue=true,$cycle_related_crmid=null, $toHtml=false) { //crmv@106856 crmv@177561 crmv@203075 crmv@205151
static $cacheWsEntities = array();
global $current_user, $adb;
$PMUtils = ProcessMakerUtils::getInstance();
//crmv@105312
global $engine, $current_process_actionid;
$engine = $this;
$current_process_actionid = $actionid;
//crmv@105312e
$entityCache = $this->getEntityCache();
$PMUtils->setDefaultDataFormat();
//crmv@106856
if ($value == 'advanced_field_assignment') {
$advanced_value = false;
if ($actionid !== false) {
$conditions = $this->vte_metadata['actions'][$actionid]['advanced_field_assignment'][$fieldname];
} else {
$conditions = $this->helper['advanced_field_assignment'][$fieldname];
}
if (!empty($conditions)) {
foreach($conditions as $conditionid => $condition) {
$cond = Zend_Json::encode($condition['conditions']);
list($metaid,$module) = explode(':',$condition['meta_record']);
if ($module == 'DynaForm') {
$processDynaFormObj = ProcessDynaForm::getInstance();
$crmid = $processDynaFormObj->getProcessesId($this->running_process,$metaid);
$webserviceObject = VtenextWebserviceObject::fromName($adb,'Processes');//crmv@207871
$wsId = vtws_getId($webserviceObject->getEntityId(),$crmid);
$entityData = $entityCache->forId($wsId);
require_once("include/events/include.inc");
require_once("modules/Settings/ProcessMaker/ProcessMakerHandler.php");
$processMakerHandler = new ProcessMakerHandler();
$processMakerHandler->addDynaFormData($entityData, array(
'processid' => $this->processid,
'dynaformmetaid' => $metaid,
'dynaformvalues' => $processDynaFormObj->getValues($this->running_process, $metaid),
));
if ($PMUtils->evaluateCondition($entityCache, $wsId, $cond)) {
$advanced_value = $condition['value'];
$advanced_field_condition = $conditionid;
break;
}
} else {
$crmid = $this->getCrmid($metaid,$this->running_process);
$webserviceObject = VtenextWebserviceObject::fromName($adb,$module);//crmv@207871
$wsId = vtws_getId($webserviceObject->getEntityId(),$crmid);
if ($PMUtils->evaluateCondition($entityCache, $wsId, $cond)) {
$advanced_value = $condition['value'];
$advanced_field_condition = $conditionid;
break;
}
}
}
}
if ($advanced_value !== false) {
return $this->replaceTags($fieldname,$advanced_value,$referenceFields,$ownerFields,$actionid,$cycleIndex,$advanced_field_condition);
}
}
//crmv@106856e
// replace tags
preg_match_all('/(\$([0-9:]+)-([a-zA-Z0-9_)( :]+))/', $value, $matches, PREG_SET_ORDER);
if (!empty($matches)) {
$PMUtils->sortTags($matches); //crmv@163717 crmv@182554
foreach($matches as $match) {
$tag = trim($match[0]);
$tag_metaid = $tag_metaid_orig = $match[2]; //crmv@159329
//crmv@149520 crmv@151737_5
$tag_fieldname = trim($match[3]);
if (substr_count($tag_fieldname,')') == (substr_count($tag_fieldname,'(') + 1)) {
$pos = strrpos($tag,')');
if (strrpos($tag,')') !== false) $tag = substr_replace($tag,'',$pos,strlen(')'));
$pos = strrpos($tag_fieldname,')');
if(strrpos($tag_fieldname,')') !== false) $tag_fieldname = substr_replace($tag_fieldname,'',$pos,strlen(')'));
} elseif (substr_count($tag_fieldname,'(') != substr_count($tag_fieldname,')')) {
$tag = trim(trim($tag,')'));
$tag_fieldname = trim(trim($tag_fieldname,')'));
}
//crmv@149520e crmv@151737_5e
if (strpos($tag_metaid,':') === false) {
$running_process = $engine->running_process;
} else {
list($meta_processid,$tag_metaid) = explode(':',$tag_metaid);
$running_process = $PMUtils->getRelatedRunningProcess($engine->running_process,$engine->processid,$meta_processid);
}
if (!isset($cacheWsEntities[$running_process][$tag_metaid]) || $cycle_related_crmid != null) {//crmv@203075
$mrecord = $engine->getCrmid($tag_metaid,$running_process);
//crmv@203075
if(empty($mrecord) && $cycle_related_crmid != null)
$mrecord = $cycle_related_crmid;
//crmv@203075e
if (!empty($mrecord)) {
$cacheWsEntities[$running_process][$tag_metaid]['entityId'] = vtws_getWebserviceEntityId(getSalesEntityType($mrecord,true),$mrecord);
}
}
$entityId = $cacheWsEntities[$running_process][$tag_metaid]['entityId'];
if (!empty($entityId)) {
if (strpos($tag_fieldname,'::') !== false) { //crmv@149520
// table field
//crmv@182891 crmv@195745
$matches2 = $matches3 = [];
preg_match('/\((\w+) : \(([_\w]+)\) (\w+)::(\w+)\)/', $tag_fieldname, $matches2);
if (count($matches2) == 0) {
// ex: (ml1::f3 : (Accounts) accountname):last
preg_match('/\((\w+)::(\w+) : \(([_\w]+)\) (\w+)\)/', $tag_fieldname, $matches3);
}
if (count($matches2) > 0) {
// ex. (parent_id : (Accounts) ml3::f8):curr
list($entityWsModule,$entityCrmid) = explode('x',$entityId);
$entityModule = getSalesEntityType($entityCrmid,true);
$entityFocus = CRMEntity::getInstance($entityModule);
$fieldInstance = Vtecrm_Field::getInstance($matches2[1], Vtecrm_Module::getInstance($entityModule));
$tmp = getSingleFieldValue($fieldInstance->table, $fieldInstance->column, $entityFocus->tab_name_index[$fieldInstance->table], $entityCrmid); // crmv@194759
$entityId = vtws_getWebserviceEntityId(getSalesEntityType($tmp,true),$tmp);
$tfield = $matches2[3];
$tcol = $matches2[4];
} elseif (count($matches3) > 0) {
$tfield = $matches3[1];
$tcol = $matches3[2];
$relmod = $matches3[3];
$relfield = $matches3[4];
} else {
list($tfield, $tcol) = explode('::', $tag_fieldname); //crmv@149520
if (($sp = strpos($tcol, ' ')) !== false) {
$tcol = substr($tcol, 0, $sp);
}
}
//crmv@182891e
$tfield = ltrim($tfield, '(');
if ($tfield == 'prodblock') {
/*if (empty($relmod)) {
list($entityWsModule,$entityCrmid) = explode('x',$entityId);
$relmod = getSalesEntityType($entityCrmid,true);
}*/
$replacement = $PMUtils->replacePBlockFieldTag($entityId, $tfield, $tcol, $cycleIndex, $relmod, $relfield);
} else {
$replacement = $PMUtils->replaceTableFieldTag($entityId, $tfield, $tcol, $cycleIndex, $relmod, $relfield);
}
// crmv@195745e
if ($toHtml) $replacement = $this->replacementToHtml($replacement); // crmv@205151
$value = str_replace($tag,$replacement,$value);
} else {
$simpleTag = str_replace('$'.$tag_metaid_orig.'-','$',$tag); //crmv@159329
$st = new VTSimpleTemplate($simpleTag,$prepareValue); //crmv@177561
$replacement = $st->render($entityCache,$entityId);
if ($tag != $replacement && (in_array($fieldname,$referenceFields) || in_array($fieldname,$ownerFields)) && stripos($replacement,'x') !== false) {
list($wsModule,$replacement) = explode('x',$replacement);
}
if ($toHtml) $replacement = $this->replacementToHtml($replacement); // crmv@205151
$value = str_replace($tag,$replacement,$value);
}
}
}
}
// end
// replace dynaform tags
//preg_match_all('/(\$DF([0-9]+)-([a-zA-Z0-9_)( :]+))/', $value, $matches, PREG_SET_ORDER);
preg_match_all('/(\$DF([0-9:]+)-([a-zA-Z0-9_)( :]+))/', $value, $matches, PREG_SET_ORDER);
if (!empty($matches)) {
$PMUtils->sortTags($matches); //crmv@163717 crmv@182554
foreach($matches as $match) {
$tag = trim($match[0]);
$dynaform_metaid = $match[2];
$dynaform_fieldname = trim($match[3]);
//crmv@149520 crmv@151737_5
if (substr_count($dynaform_fieldname,')') == (substr_count($dynaform_fieldname,'(') + 1)) {
$pos = strrpos($tag,')');
if (strrpos($tag,')') !== false) $tag = substr_replace($tag,'',$pos,strlen(')'));
$pos = strrpos($dynaform_fieldname,')');
if(strrpos($dynaform_fieldname,')') !== false) $dynaform_fieldname= substr_replace($dynaform_fieldname,'',$pos,strlen(')'));
} elseif (substr_count($dynaform_fieldname,'(') != substr_count($dynaform_fieldname,')')) {
$tag = trim(trim($tag,')'));
$dynaform_fieldname = trim(trim($dynaform_fieldname,')'));
}
//crmv@149520e crmv@151737_5e
if (strpos($dynaform_metaid,':') === false) {
$running_process = $engine->running_process;
} else {
list($meta_processid,$dynaform_metaid) = explode(':',$dynaform_metaid);
$running_process = $PMUtils->getRelatedRunningProcess($engine->running_process,$engine->processid,$meta_processid);
}
$processDynaFormObj = ProcessDynaForm::getInstance();
$dynaform_values = $processDynaFormObj->getValues($running_process,$dynaform_metaid);
if (strpos($dynaform_fieldname, '::') !== false) {
// table field
list($tfield, $tcol) = explode('::', $dynaform_fieldname);
if (($sp = strpos($tcol, ' ')) !== false) {
$tcol = substr($tcol, 0, $sp);
}
$replacement = $PMUtils->applyTableFieldFunct('dynaform', $dynaform_values[$tfield], $tfield, $tcol, $cycleIndex);
if ($toHtml) $replacement = $this->replacementToHtml($replacement); // crmv@205151
$value = str_replace($tag,$replacement,$value);
} else {
// crmv@176245
preg_match('/\((\w+) : \(([_\w]+)\) (\w+)\)/', $dynaform_fieldname, $reference_matches);
if (count($reference_matches) > 0) {
$referenceId = $dynaform_values[$reference_matches[1]];
$referenceFocus = CRMEntity::getInstance($reference_matches[2]);
$error = $referenceFocus->retrieve_entity_info_no_html($referenceId,$reference_matches[2],false);
(empty($error)) ? $referenceValue = $referenceFocus->column_fields[$reference_matches[3]] : $referenceValue = '';
$value = str_replace($tag,$referenceValue,$value);
} else {
// crmv@176245e
// crmv@177561
$uitype = null;
$blocks = $processDynaFormObj->getStructure($engine->processid, false, $dynaform_metaid, $running_process);
foreach($blocks as $block) {
foreach($block['fields'] as $field) {
if ($field['fieldname'] == $dynaform_fieldname) $uitype = $field['uitype'];
}
}
if (!empty($prepareValue)) {
$st = new VTSimpleTemplate('',true);
$dynaform_values[$dynaform_fieldname] = $st->prepareValue($dynaform_values[$dynaform_fieldname], $dynaform_fieldname, '', $dynaform_values, $uitype);
}
// crmv@177561e
$value = str_replace($tag,$dynaform_values[$dynaform_fieldname],$value);
}
}
}
}
// end
// crmv@146671
// replace Webservice tags
preg_match_all('/(\$WS([0-9:]+)-([a-zA-Z0-9_)( :]+))/', $value, $matches, PREG_SET_ORDER);
if (!empty($matches)) {
foreach($matches as $match) {
$tag = trim($match[0]);
$metaid = $match[2];
$fieldname = trim($match[3]);
//crmv@149520
if (substr_count($fieldname,'(') != substr_count($fieldname,')')) {
$tag = trim(trim($tag,')'));
$fieldname = trim(trim($fieldname,')'));
}
//crmv@149520e
if (strpos($metaid,':') === false) {
$running_process = $engine->running_process;
} else {
list($meta_processid,$metaid) = explode(':',$metaid);
$running_process = $PMUtils->getRelatedRunningProcess($engine->running_process,$engine->processid,$meta_processid);
}
$wsvalues = $PMUtils->getExtWSResultValues($running_process,$metaid,$actionid,$this); // crmv@147433
$value = str_replace($tag,$wsvalues[$fieldname],$value);
}
}
// crmv@146671e
//crmv@100591 replace actors tags
preg_match_all('/(\$ACTOR-([a-zA-Z0-9_]+))/', $value, $matches, PREG_SET_ORDER);
if (!empty($matches)) {
foreach($matches as $match) {
$tag = trim($match[0]);
$elementid = trim($match[2]);
$replacement = $PMUtils->getActor($engine->running_process, $elementid);
if (!empty($replacement)) {
$value = str_replace($tag,$replacement,$value);
}
}
}
//crmv@100591e
// apply sdk functions
preg_match_all('/\$sdk:([a-zA-Z0-9_]+)\(([^)]*)\)/', $value, $matches, PREG_SET_ORDER);
if (!empty($matches)) {
$sdkFieldConditions = SDK::getProcessMakerFieldActions();
foreach($matches as $match) {
$tag = trim($match[0]);
$funct = $match[1];
if (isset($sdkFieldConditions[$funct])) {
$params = trim($match[2]);
//crmv@113527
if (empty($params)) {
if ($actionid !== false && $advanced_field_condition !== false) {
$params = trim($this->vte_metadata['actions'][$actionid]['advanced_field_assignment'][$fieldname][$advanced_field_condition]['sdk_params']);
} elseif ($actionid !== false) {
$params = trim($this->vte_metadata['actions'][$actionid]['sdk_params'][$fieldname]);
} elseif ($advanced_field_condition !== false) {
$params = trim($this->helper['advanced_field_assignment'][$fieldname][$advanced_field_condition]['sdk_params']);
} else {
$params = trim($this->helper['sdk_params_'.$fieldname]);
}
if (!empty($params)) {
$params = $this->replaceTags($fieldname,$params,$referenceFields,$ownerFields,$actionid,$cycleIndex);
}
}
//crmv@113527e
if (!empty($params)) {
$params = explode(',',$params);
array_walk($params, function(&$v,$k) {
$v = trim($v);
});
} else {
$params = array();
}
require_once($sdkFieldConditions[$funct]['src']);
$replacement = call_user_func_array($funct, $params);
} else {
$replacement = '';
}
$value = str_replace($tag,$replacement,$value);
}
}
// end
$value = str_replace('[\n]',"\n",$value); //crmv@128159
$PMUtils->restoreDataFormat();
return $value;
}
// crmv@102879e
// crmv@205151
/**
* Function used when replacing a variable that has to be seen/sent in html format (eg: email action)
*/
protected function replacementToHtml($replacement) {
// add here other translations, if needed
return nl2br($replacement);
}
// crmv@205151e
//crmv@115579
function isParallelCondition($running_process, $elementid) {
global $adb, $table_prefix;
$result = $adb->pquery("select conditionssons from {$table_prefix}_process_gateway_conn where running_process = ?", array($running_process));
if ($result && $adb->num_rows($result) > 0) {
while($row=$adb->fetchByAssoc($result,-1,false)) {
$conditionssons = Zend_Json::decode($row['conditionssons']);
if (in_array($elementid,$conditionssons)) {
return true;
}
}
}
return false;
}
//crmv@115579e
}