* SPDX-License-Identifier: AGPL-3.0-only ************************************/ /* crmv@92272 crmv@96450 crmv@97566 crmv@102879 crmv@115579 crmv@115268 crmv@126096 crmv@150751 crmv@163905 */ require_once('include/Zend/Json.php'); class ProcessMakerUtils extends SDKExtendableUniqueClass { var $uploadMaxSize; var $importDirectory; var $table_name; var $edit_permission_mode = 'all'; //crmv@105685 all | assigned var $limit_processes = 2; //crmv@98899 var $modules_not_supported = array('Documents','Emails','Faq','Users','ModComments','Messages','Fax','Sms','MyFiles','Processes','PBXManager'); //crmv@37660 crmv@106461 crmv@113771 crmv@148531 crmv@153819 crmv@164120 crmv@164122 // excluded modules from link to var $modules_excluded_link = array('Emails','Users','ModComments','Messages','Fax','Sms','MyFiles','Processes'); // crmv@126184 crmv@148531 crmv@153819 crmv@164120 crmv@164122 var $editoptions_uitypes_not_supported = array(4,54,56,26,27,212,5,6,23,73); //crmv@128159 crmv@160843 //crmv@182172 var $blocks_not_supported = array( 'HelpDesk' => array('LBL_COMMENTS','LBL_SIGNATURE_BLOCK'), ); //crmv@182172e var $megaFunctions = false; //crmv@135190 //crmv@135193 var $skip_notifications_actions = false; // skip notifications created by actions var $skip_notifications_helper = false; // skip notifications of ProcessHelper var $hide_changelog = false; // hide changelog made by processes //crmv@135193e var $versioning_skip_modules = array('Events'); //crmv@180014 var $startVersionNumber = '1.0'; //crmv@147720 var $cacheStorage = 'session'; //crmv@153321_5 session | file var $preserved_request = array(); // crmv@189728 var $debugLogs = array( 'Conditions' => array( 'active' => false, 'file' => 'logs/ProcessEngine/Conditions.log', ) ); // crmv@189728e var $metadataTypes = array( 'ConditionTask'=>array( 'php'=>'modules/Settings/ProcessMaker/Metadata/ConditionTask.php', 'tpl'=>'Settings/ProcessMaker/Metadata/ConditionTask.tpl', ), 'ActionTask'=>array( 'php'=>'modules/Settings/ProcessMaker/Metadata/ActionTask.php', 'tpl'=>'Settings/ProcessMaker/Metadata/ActionTask.tpl', ), 'ParallelGateway'=>array( 'php'=>'modules/Settings/ProcessMaker/Metadata/ParallelGateway.php', 'tpl'=>'Settings/ProcessMaker/Metadata/ParallelGateway.tpl', ), 'Gateway'=>array( 'php'=>'modules/Settings/ProcessMaker/Metadata/Gateway.php', 'tpl'=>'Settings/ProcessMaker/Metadata/Gateway.tpl', ), 'TimerStart'=>array( 'php'=>'modules/Settings/ProcessMaker/Metadata/TimerStart.php', 'tpl'=>'Settings/ProcessMaker/Metadata/TimerStart.tpl', ), 'TimerIntermediate'=>array( 'php'=>'modules/Settings/ProcessMaker/Metadata/TimerIntermediate.php', 'tpl'=>'Settings/ProcessMaker/Metadata/TimerIntermediate.tpl', ), 'TimerBoundaryInterr'=>array( 'php'=>'modules/Settings/ProcessMaker/Metadata/TimerBoundary.php', 'tpl'=>'Settings/ProcessMaker/Metadata/TimerBoundary.tpl', ), 'TimerBoundaryNonInterr'=>array( 'php'=>'modules/Settings/ProcessMaker/Metadata/TimerBoundary.php', 'tpl'=>'Settings/ProcessMaker/Metadata/TimerBoundary.tpl', ), //crmv@97575 'SubProcess'=>array( 'php'=>'modules/Settings/ProcessMaker/Metadata/SubProcess.php', 'tpl'=>'Settings/ProcessMaker/Metadata/SubProcess.tpl', ), //crmv@97575e ); var $actionTypes = array( 'Create' => array( 'class'=>'PMActionCreate', 'php_file'=>'modules/Settings/ProcessMaker/actions/Create.php', 'tpl_file'=>'Settings/ProcessMaker/actions/Create.tpl' ), 'Update' => array( 'class'=>'PMActionUpdate', 'php_file'=>'modules/Settings/ProcessMaker/actions/Update.php', 'tpl_file'=>'Settings/ProcessMaker/actions/Update.tpl' ), 'Delete' => array( 'class'=>'PMActionDelete', 'php_file'=>'modules/Settings/ProcessMaker/actions/Delete.php', 'tpl_file'=>'Settings/ProcessMaker/actions/Delete.tpl' ), //crmv@183346 'ModNotification' => array( 'class'=>'PMActionModNotification', 'php_file'=>'modules/Settings/ProcessMaker/actions/ModNotification.php', 'tpl_file'=>'Settings/ProcessMaker/actions/ModNotification.tpl' ), //crmv@183346e 'Email' => array( 'class'=>'PMActionEmail', 'php_file'=>'modules/Settings/ProcessMaker/actions/Email.php', 'tpl_file'=>'Settings/ProcessMaker/actions/Email.tpl' ), //crmv@126696 'SendNewsletter' => array( 'class'=>'PMActionSendNewsletter', 'php_file'=>'modules/Settings/ProcessMaker/actions/SendNewsletter.php', 'tpl_file'=>'Settings/ProcessMaker/actions/SendNewsletter.tpl' ), //crmv@126696e // crmv@187729 'CreatePDF' => array( 'class'=>'PMActionCreatePDF', 'php_file'=>'modules/Settings/ProcessMaker/actions/CreatePDF.php', 'tpl_file'=>'Settings/ProcessMaker/actions/CreatePDF.tpl' ), // crmv@187729e //crmv@105685 'ResetDynaform' => array( 'class'=>'PMActionResetDynaform', 'php_file'=>'modules/Settings/ProcessMaker/actions/ResetDynaform.php', 'tpl_file'=>'Settings/ProcessMaker/actions/ResetDynaform.tpl' ), //crmv@105685e 'Cycle' => array( 'class'=>'PMActionCycle', 'php_file'=>'modules/Settings/ProcessMaker/actions/Cycle.php', 'tpl_file'=>'Settings/ProcessMaker/actions/Cycle.tpl', 'actions'=>array('Email','Create','Update','ModNotification','InsertTableRow','DeleteTableRow','InsertProductRow','DeleteProductRow') //crmv@183346 crmv@195745 ), //crmv@203075 'CycleRelated' => array( 'class'=>'PMActionCycleRelated', 'php_file'=>'modules/Settings/ProcessMaker/actions/CycleRelated.php', 'tpl_file'=>'Settings/ProcessMaker/actions/CycleRelated.tpl', 'actions'=>array('Email','Create','Update','ModNotification','InsertTableRow', 'CreatePDF') //crmv@183346 crmv@195745 ), //crmv@203075e //crmv@112297 'DeleteConditionals' => array( 'class'=>'PMActionDeleteConditionals', 'php_file'=>'modules/Settings/ProcessMaker/actions/DeleteConditionals.php', 'tpl_file'=>'Settings/ProcessMaker/actions/DeleteConditionals.tpl' ), //crmv@112297e //crmv@113775 'Relate' => array( 'class'=>'PMActionRelate', 'php_file'=>'modules/Settings/ProcessMaker/actions/Relate.php', 'tpl_file'=>'Settings/ProcessMaker/actions/Relate.tpl' ), //crmv@113775e //crmv@126184 'RelateStatic' => array( 'class'=>'PMActionRelateStatic', 'php_file'=>'modules/Settings/ProcessMaker/actions/RelateStatic.php', 'tpl_file'=>'Settings/ProcessMaker/actions/RelateStatic.tpl' ), //crmv@126184e //crmv@185548 'TransferRelations' => array( 'class'=>'PMActionTransferRelations', 'php_file'=>'modules/Settings/ProcessMaker/actions/TransferRelations.php', 'tpl_file'=>'Settings/ProcessMaker/actions/TransferRelations.tpl' ), //crmv@185548e 'InsertTableRow' => array( 'class'=>'PMActionInsertTableRow', 'php_file'=>'modules/Settings/ProcessMaker/actions/InsertTableRow.php', 'tpl_file'=>'Settings/ProcessMaker/actions/InsertTableRow.tpl' ), 'DeleteTableRow' => array( 'class'=>'PMActionDeleteTableRow', 'php_file'=>'modules/Settings/ProcessMaker/actions/DeleteTableRow.php', 'tpl_file'=>'Settings/ProcessMaker/actions/DeleteTableRow.tpl', 'hide_main_menu'=>true ), // crmv@195745 'CloneProductsBlock' => array( 'class'=>'PMActionCloneProductsBlock', 'php_file'=>'modules/Settings/ProcessMaker/actions/CloneProductsBlock.php', 'tpl_file'=>'Settings/ProcessMaker/actions/CloneProductsBlock.tpl' ), 'InsertProductRow' => array( 'class'=>'PMActionInsertProductRow', 'php_file'=>'modules/Settings/ProcessMaker/actions/InsertProductRow.php', 'tpl_file'=>'Settings/ProcessMaker/actions/InsertTableRow.tpl' ), 'DeleteProductRow' => array( 'class'=>'PMActionDeleteProductRow', 'php_file'=>'modules/Settings/ProcessMaker/actions/DeleteProductRow.php', 'tpl_file'=>'Settings/ProcessMaker/actions/DeleteTableRow.tpl', 'hide_main_menu'=>true ), // crmv@195745e // crmv@146671 'CallExtWS' => array( 'class'=>'PMActionCallExtWS', 'php_file'=>'modules/Settings/ProcessMaker/actions/CallExtWS.php', 'tpl_file'=>'Settings/ProcessMaker/actions/CallExtWS.tpl' ), // crmv@146671e ); function __construct() { global $upload_maxsize, $import_dir, $table_prefix; $this->uploadMaxSize = $upload_maxsize; $this->importDirectory = $import_dir; $this->table_name = $table_prefix.'_processmaker'; eval(Users::m_de_cryption()); eval($hash_version[22]); } // crmv@189728 function debug($type, $str, $start=false) { if ($this->debugLogs[$type]['active']) { if ($start) file_put_contents($this->debugLogs[$type]['file'],"-------------------- ".date('Y-m-d H:i:s')." --------------------\n",FILE_APPEND); if (is_array($str)) file_put_contents($this->debugLogs[$type]['file'],print_r($str,true),FILE_APPEND); else file_put_contents($this->debugLogs[$type]['file'],$str."\n",FILE_APPEND); } } // crmv@189728e //crmv@98899 function limitProcessesExceeded() { global $adb, $table_prefix; $result = $adb->query("SELECT COUNT(*) as \"count\" FROM {$table_prefix}_processmaker WHERE active = 1"); if ($result && $adb->num_rows($result) > 0) { $count = $adb->query_result($result,0,'count'); if ($count > $this->limit_processes) return $count; } return false; } //crmv@98899e function checkActiveProcesses() { global $adb, $table_prefix; $result = $adb->query("SELECT COUNT(*) as \"count\" FROM {$table_prefix}_processmaker WHERE active = 1"); if ($result && $adb->num_rows($result) > 0) { $count = $adb->query_result($result,0,'count'); if ($count < $this->limit_processes) return true; } return false; } function formatType($type, $display=false) { if (strpos($type,':') !== false) $type = substr($type,strpos($type,':')+1); if ($display) $type = "BPMN-$type"; return $type; } function getMetadataTypes($type='',$structure=array()) { if (!empty($type)) { //$metadataType = $this->metadataTypes[$type]; //if (empty($metadataType)) { if ($type == 'Task') { $metadataType = $this->metadataTypes['ConditionTask']; } elseif (strpos($type,'Task') !== false || $type == 'EndEvent') { $metadataType = $this->metadataTypes['ActionTask']; } elseif ($type == 'ParallelGateway') { $metadataType = $this->metadataTypes['ParallelGateway']; } elseif (strpos($type,'Gateway') !== false) { $metadataType = $this->metadataTypes['Gateway']; } elseif ($type == 'StartEvent' && $structure['subType'] == 'TimerEventDefinition') { $metadataType = $this->metadataTypes['TimerStart']; } elseif ($type == 'IntermediateCatchEvent' && $structure['subType'] == 'TimerEventDefinition') { $metadataType = $this->metadataTypes['TimerIntermediate']; } elseif ($type == 'BoundaryEvent' && $structure['subType'] == 'TimerEventDefinition') { ($structure['cancelActivity']) ? $metadataType = $this->metadataTypes['TimerBoundaryInterr'] : $metadataType = $this->metadataTypes['TimerBoundaryNonInterr']; //crmv@97575 } elseif ($type == 'SubProcess') { $metadataType = $this->metadataTypes['SubProcess']; } //crmv@97575e //} return $metadataType; } else { return $this->metadataTypes; } } function getEngineType($structure) { $engineType = ''; if ($structure['type'] == 'Task') { $engineType = 'Condition'; } elseif (strpos($structure['type'],'Task') !== false || $structure['type'] == 'EndEvent') { $engineType = 'Action'; } elseif (strpos($structure['type'],'Gateway') !== false) { $engineType = 'Gateway'; } elseif ($structure['type'] == 'StartEvent' && $structure['subType'] == 'TimerEventDefinition') { $engineType = 'TimerStart'; } elseif ($structure['type'] == 'IntermediateCatchEvent' && $structure['subType'] == 'TimerEventDefinition') { $engineType = 'TimerIntermediate'; } elseif ($structure['type'] == 'BoundaryEvent' && $structure['subType'] == 'TimerEventDefinition') { ($structure['cancelActivity']) ? $engineType = 'TimerBoundaryInterr' : $engineType = 'TimerBoundaryNonInterr'; //crmv@97575 } elseif ($structure['type'] == 'SubProcess') { $engineType = 'SubProcess'; } //crmv@97575e return $engineType; } // function getVteType($id,$elementid) { // $structure = $this->getStructure($id); // $element = $structure['tree'][$elementid]; // preprint($element); // } function getActionTypes($type='') { $actionTypes = $this->actionTypes; foreach($actionTypes as $actionType => $info) { $actionTypes[$actionType]['label'] = getTranslatedString('LBL_PM_ACTION_'.$actionType,'Settings'); } $sdkActions = SDK::getProcessMakerActions(); if (!empty($sdkActions)) { foreach($sdkActions as $sdkAction) { $actionTypes['SDK:'.$sdkAction['funct']] = $sdkAction; } } if (!empty($type)) { return $actionTypes[$type]; } else { return $actionTypes; } } function isStartTask($id,$elementid,$running_process='') { $incoming = $this->getIncoming($id,$elementid,$running_process); return ($incoming[0]['shape']['type'] == 'StartEvent'); } function isEndTask($bpmnType) { if ($bpmnType == 'EndEvent') { // TODO add other types of end events return true; } else { return false; } } function getHeaderList($relate=false) { if ($relate) return array( '', getTranslatedString('LBL_PROCESS_MAKER_RECORD_NAME','Settings'), getTranslatedString('LBL_PROCESS_MAKER_RECORD_DESC','Settings'), getTranslatedString('LBL_PM_SUBPROCESSES','Settings'), getTranslatedString('LBL_MODULE'), //crmv@185705 getTranslatedString('Active') ); else return array( getTranslatedString('LBL_ACTIONS'), getTranslatedString('LBL_PROCESS_MAKER_RECORD_NAME','Settings'), getTranslatedString('LBL_PROCESS_MAKER_RECORD_DESC','Settings'), getTranslatedString('LBL_PM_SUBPROCESSES','Settings'), getTranslatedString('LBL_MODULE'), //crmv@185705 getTranslatedString('Active') ); } function getList($relate=false, $skip_ids='', $record_checked='') { //crmv@161211 global $adb, $table_prefix, $theme, $app_strings; //crmv@185705 $list = array(); //crmv@185705 $query = "select {$this->table_name}.id, {$this->table_name}.name, {$this->table_name}.description, {$this->table_name}.active, {$this->table_name}.version, {$table_prefix}_processmaker_metarec.module from {$this->table_name} left join {$table_prefix}_processmaker_metarec on {$table_prefix}_processmaker.id = {$table_prefix}_processmaker_metarec.processid and {$table_prefix}_processmaker_metarec.start = 1"; //crmv@185705e $params = array(); if ($relate) { //crmv@161211 if (!is_array($skip_ids)) $skip_ids = array($skip_ids); $query .= " where {$this->table_name}.id not in (".generateQuestionMarks($skip_ids).")"; $params[] = $skip_ids; //crmv@161211e } $result = $adb->pquery($query, $params); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result,-1,false)) { $subprocesses_text = array(); $subprocesses = $this->getSubprocesses($row['id']); if (!empty($subprocesses)) { foreach($subprocesses as $elementid => $subprocess) { if ($relate) { $subprocesses_text[] = textlength_check($subprocess['name']); } else { $subprocesses_text[] = ''.textlength_check($subprocess['name']).''; } } } if (count($subprocesses_text) > 3) $subprocesses_text = $subprocesses_text[0].', '.$subprocesses_text[1].', '.$subprocesses_text[2].', ...'; else $subprocesses_text = implode(',',$subprocesses_text); if ($relate) { (!empty($record_checked) && $record_checked == $row['id']) ? $checked = 'checked' : $checked = ''; $list[] = array( '', '', textlength_check($row['description']), $subprocesses_text, getTranslatedString($row['module'],$row['module']), //crmv@185705 ($row['active'] == 1) ? $app_strings['yes'] : $app_strings['no'], ); } else { //crmv@147720 $list[] = array( 'clear device_hub file_download file_upload', ''.textlength_check($row['name']).'', textlength_check($row['description']), $subprocesses_text, getTranslatedString($row['module'],$row['module']), //crmv@185705 ($row['active'] == 1) ? $app_strings['yes'] : $app_strings['no'], ); //crmv@147720e } } } return $list; } //crmv@100972 crmv@147720 function checkUploadBPMN(&$err='', $upload_ext=array()) { if (empty($upload_ext)) $upload_ext = array('bpmn','vtebpmn'); if (isset($_FILES['bpmnfile']['tmp_name']) && !empty($_FILES['bpmnfile']['tmp_name'])) { $xml = file_get_contents($_FILES['bpmnfile']['tmp_name']); } if (!empty($xml)) { $ext = pathinfo($_FILES['bpmnfile']['name'], PATHINFO_EXTENSION); if (!in_array($ext,$upload_ext)) { $err = getTranslatedString('LBL_INVALID_FILE_EXTENSION', 'Settings'); return false; } if(!is_uploaded_file($_FILES['bpmnfile']['tmp_name'])) { $err = getTranslatedString('LBL_FILE_UPLOAD_FAILED', 'Import'); return false; } if ($_FILES['bpmnfile']['size'] > $this->uploadMaxSize) { $err = getTranslatedString('LBL_IMPORT_ERROR_LARGE_FILE', 'Import').' $uploadMaxSize.'.getTranslatedString('LBL_IMPORT_CHANGE_UPLOAD_SIZE', 'Import'); return false; } if(!is_writable($this->importDirectory)) { $err = getTranslatedString('LBL_IMPORT_DIRECTORY_NOT_WRITABLE', 'Import'); return false; } } return true; } function readUploadedFile($file_content) { $data = array(); $data['file'] = $file_content; if (stripos($file_content,'') !== false) { $xmlObj = new SimpleXMLElement($file_content); $data['name'] = strval($xmlObj->name); $data['description'] = strval($xmlObj->description); $data['version'] = strval($xmlObj->version); $data['bpmn'] = base64_decode($xmlObj->bpmn); $data['vte_metadata'] = base64_decode($xmlObj->vte_metadata); $data['structure'] = base64_decode($xmlObj->structure); $data['helper'] = base64_decode($xmlObj->helper); $data['metarec'] = base64_decode($xmlObj->metarec); $data['dynameta'] = base64_decode($xmlObj->dynameta); $data['system_versions'] = base64_decode($xmlObj->system_versions); // TODO wsmeta } else { $data['bpmn'] = $file_content; } return $data; } function save($data, $id=null, $overwrite=false, $pending_changes=true) { global $adb, $table_prefix, $default_charset; //crmv@132240 crmv@193096 if (empty($id) || $overwrite) { $name = $data['name']; $description = $data['description']; $version = $data['version']; $xml = $data['bpmn']; $vte_metadata = $data['vte_metadata']; $structure = $data['structure']; $helper = $data['helper']; $metarec = $data['metarec']; $dynameta = $data['dynameta']; $wsmeta = $data['wsmeta']; // TODO export wsmeta!!! if (empty($version)) $version = $this->startVersionNumber; if (empty($id)) { // create // crmv@193096 $id = $adb->getUniqueID($this->table_name); $values = array( 'id' => $id, 'name' => $name, 'description' => $description, 'vte_metadata' => $vte_metadata, 'structure' => $structure, 'helper' => $helper, 'version' => $version ); $cols = $adb->getColumnNames($this->table_name); // crmv@205568 if (in_array('creatorid', $cols)) { global $current_user; (!empty($current_user)) ? $user = $current_user : $user = Users::getActiveAdminUser(); $values['creatorid'] = $user->id; } // crmv@205568e if (in_array('createdtime', $cols)) $values['createdtime'] = date('Y-m-d H:i:s'); $adb->pquery("insert into {$this->table_name}(".implode(',',array_keys($values)).") values(".generateQuestionMarks($values).")", array($values)); // crmv@193096e } elseif ($overwrite) { // update in overwrite mode $adb->pquery("update {$this->table_name} set name = ?, description = ?, vte_metadata = ?, structure = ?, helper = ?, version = ? where id = ?", array($name,$description,$vte_metadata,$structure,$helper,$version,$id)); $adb->pquery("delete from {$table_prefix}_processmaker_metarec where processid = ?", array($id)); $adb->pquery("delete from {$table_prefix}_process_dynaform_meta where processid = ?", array($id)); $adb->pquery("delete from {$table_prefix}_process_extws_meta where processid = ?", array($id)); // TODO reset subprocesses and timers such as $this->edit() } $adb->updateClob($this->table_name,'xml',"id=$id",$xml); // save records involved if (!empty($metarec)) { foreach($metarec as $r) { $r['processid'] = $id; $r['text'] = html_entity_decode($r['text'],ENT_QUOTES,$default_charset); //crmv@132240 $adb->pquery("insert into {$table_prefix}_processmaker_metarec(".implode(',',array_keys($r)).") values (".generateQuestionMarks($r).")", $r); } } // save dynaform informations if (!empty($dynameta)) { foreach($dynameta as $r) { $r['processid'] = $id; $r['text'] = html_entity_decode($r['text'],ENT_QUOTES,$default_charset); //crmv@132240 $adb->pquery("insert into {$table_prefix}_process_dynaform_meta(".implode(',',array_keys($r)).") values (".generateQuestionMarks($r).")", $r); } } // crmv@146671 // save wscall informations if (!empty($wsmeta)) { foreach($wsmeta as $r) { $r['processid'] = $id; $r['text'] = html_entity_decode($r['text'],ENT_QUOTES,$default_charset); //crmv@132240 $adb->pquery("insert into {$table_prefix}_process_extws_meta(".implode(',',array_keys($r)).") values (".generateQuestionMarks($r).")", $r); } } // crmv@146671e } else { // update in merge mode // TODO call $this->edit() } if ($pending_changes) $adb->pquery("update {$this->table_name} set pending_changes=? where id=?", array(1, $id)); return $id; } //crmv@100972e crmv@147720e //crmv@161988 function importFile($filepath, $active=false) { $data = $this->readUploadedFile(file_get_contents($filepath)); if (!empty($data['metarec'])) $data['metarec'] = Zend_Json::decode($data['metarec']); if (!empty($data['dynameta'])) $data['dynameta'] = Zend_Json::decode($data['dynameta']); if (empty($data['name'])) { $pathinfo = pathinfo($filepath); $data['name'] = $pathinfo['filename']; } $id = $this->save($data,null,false,false); if ($active) $this->edit($id,array('active'=>1)); } //crmv@161988e function edit($id,$data) { global $adb, $table_prefix, $default_charset; //crmv@132240 $columns = array('name','description','active','pending_changes'); $update = array(); foreach($columns as $column) { if (isset($data[$column])) $update["$column=?"] = vtlib_purify($data[$column]); } $retrieve = $this->retrieve($id); if (isset($data['vte_metadata'])) { (empty($retrieve['vte_metadata']) || $retrieve['vte_metadata'] == 'null') ? $vte_metadata = array() : $vte_metadata = $vte_metadata_old = Zend_Json::decode($retrieve['vte_metadata']); (empty($data['vte_metadata'])) ? $vte_metadata_new = array() : $vte_metadata_new = Zend_Json::decode($data['vte_metadata']); $vte_metadata = array_merge($vte_metadata, $vte_metadata_new); $update["vte_metadata=?"] = Zend_Json::encode($vte_metadata); } else { $vte_metadata = Zend_Json::decode($retrieve['vte_metadata']); } if (isset($data['helper'])) { (empty($retrieve['helper']) || $retrieve['helper'] == 'null') ? $helper = array() : $helper = Zend_Json::decode($retrieve['helper']); (empty($data['helper'])) ? $helper_new = array() : $helper_new = Zend_Json::decode($data['helper']); $helper = array_merge($helper, $helper_new); $update["helper=?"] = Zend_Json::encode($helper); } $adb->pquery("update {$this->table_name} set ".implode(',',array_keys($update))." where id = ?", array($update,$id)); // save records involved if (isset($vte_metadata)) { //$this->clearRecordsInvolved($id); $structure = $this->getStructure($id); foreach($structure['shapes'] as $shapeid => $shape) { // for all start events search the first task if ($shape['type'] == 'StartEvent') { $outgoing = $this->getOutgoing($id,$shapeid); foreach($outgoing as $out) { $engineType = $this->getEngineType($out['shape']); if ($engineType == 'Condition') { $metadata = $vte_metadata[$out['shape']['id']]; $this->setRecordInvolved($id,$out['shape']['id'],$out['shape']['text'],$out['shape']['type'],$metadata['moduleName'],0,1, $metadata['moduleName1'], $metadata['execution_condition']);//crmv@204903 } } } //crmv@97575 if ($shape['type'] == 'SubProcess') { $subprocess = $vte_metadata[$shapeid]['subprocess']; if (!empty($subprocess)) $this->setSubprocess($id,$shapeid,$subprocess); else $this->unsetSubprocess($id,$shapeid); //crmv@136524 } //crmv@97575e } foreach($vte_metadata as $elementid => $m) { if (!empty($m['actions'])) { foreach($m['actions'] as $action_id => $a) { if ($a['action_type'] == 'Create') { $start = intval($this->isStartTask($a['id'],$a['elementid'])); $this->setRecordInvolved($a['id'],$a['elementid'],$structure['shapes'][$elementid]['text'],$structure['shapes'][$elementid]['type'],$a['form_module'],$action_id,$start); } } } } } // save dynaform if (!empty($helper)) { foreach($helper as $elementid => $h) { if (!empty($h['dynaform']['mmaker_blocks'])) { $result = $adb->pquery("select * from {$table_prefix}_process_dynaform_meta where processid = ? and elementid = ?", array($id,$elementid)); if ($result && $adb->num_rows($result) == 0) { $structure = $this->getStructureElementInfo($id,$elementid,'shapes'); $metaid = $adb->getUniqueID("{$table_prefix}_process_dynaform_meta"); $adb->pquery("insert into {$table_prefix}_process_dynaform_meta(id,processid,elementid,text,type) values(?,?,?,?,?)", array($metaid,$id,$elementid,html_entity_decode($structure['text'],ENT_QUOTES,$default_charset),$structure['type'])); //crmv@132240 } } } } // if there is a start timer schedule the running process $startElementid = ''; $isTimerProcess = $this->isTimerProcess($id,$startElementid); if ($isTimerProcess && (($retrieve['active'] == 0 && $data['active'] == 1) || ($retrieve['active'] == 1 && $this->isChangedTimerCondition($vte_metadata_new[$startElementid],$vte_metadata_old[$startElementid])))) { // cancello eventuali processi schedulati non ancora partiti $result = $adb->pquery("SELECT running_process FROM {$table_prefix}_running_processes_timer INNER JOIN {$table_prefix}_running_processes ON {$table_prefix}_running_processes.id = {$table_prefix}_running_processes_timer.running_process WHERE mode = ? and {$table_prefix}_running_processes.processmakerid = ?", array('start',$id)); $delete = array(); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $delete[] = $row['running_process']; } } if (!empty($delete)) { $adb->pquery("delete from {$table_prefix}_running_processes where id in (".generateQuestionMarks($delete).")", $delete); $this->deleteTimer('start',$delete); } // schedule the first occourence $date_start = $vte_metadata[$startElementid]['date_start'].' '.$vte_metadata[$startElementid]['starthr'].':'.$vte_metadata[$startElementid]['startmin'].':00'; ($vte_metadata['date_end_mass_edit_check'] == 'on') ? $date_end = getValidDBInsertDateValue($vte_metadata['date_end']).' '.$vte_metadata['endhr'].':'.$vte_metadata['endmin'] : $date_end = false; $timer = $this->getTimerRecurrences($date_start,$date_end,($vte_metadata[$startElementid]['recurrence'] == 'on'),$vte_metadata[$startElementid]['cron_value'],1); if (!empty($timer[0])) { $running_process = $adb->getUniqueID("{$table_prefix}_running_processes"); $adb->pquery("insert into {$table_prefix}_running_processes(id,processmakerid,current,xml_version) values(?,?,?,?)", array($running_process,$id,$startElementid,$retrieve['xml_version'])); $info = array('processid'=>$id,'elementid'=>$startElementid,'running_process'=>$running_process,'calculate_next_occourence'=>true); $this->createTimer('start',$timer,$running_process,null,$startElementid,'',$info); //crmv@127048 } } } //crmv@134058 function retrieve($id, $xml_version=null) { global $adb; if (empty($xml_version)) $xml_version = 'curr'; if ($xml_version != 'curr') { //crmv@173112 $result = $adb->pquery("select count(*) as \"count\" from {$this->table_name}_versions where processmakerid = ? and xml_version = ?", array($id,$xml_version)); if ($adb->query_result($result,0,'count') == 0) $xml_version = 'curr'; } static $retrieveCache = array(); if (!isset($retrieveCache[$id][$xml_version])) { if ($xml_version == 'curr') { $result = $adb->pquery("select * from {$this->table_name} where id = ?", array($id)); } else { $result = $adb->pquery("select pmv.processmakerid as \"id\", pm.name, pm.description, pmv.version, pm.active, pmv.xml, pmv.vte_metadata, pmv.structure, pmv.helper, pmv.xml_version from {$this->table_name}_versions pmv inner join {$this->table_name} pm on pm.id = pmv.processmakerid where pmv.processmakerid = ? and pmv.xml_version = ?", array($id,$xml_version)); } if ($result && $adb->num_rows($result) > 0) { $retrieveCache[$id][$xml_version] = $adb->fetchByAssoc($result,-1,false); } else { $retrieveCache[$id][$xml_version] = false; } } return $retrieveCache[$id][$xml_version]; } //crmv@134058e function delete($id) { global $adb, $table_prefix; $adb->pquery("delete from {$this->table_name} where id = ?", array($id)); $adb->pquery("delete from {$table_prefix}_processmaker_metarec where processid = ?", array($id)); $adb->pquery("delete from {$table_prefix}_process_dynaform_meta where processid = ?", array($id)); $adb->pquery("delete from {$table_prefix}_process_extws_meta where processid = ?", array($id)); // crmv@146671 } function getMetadata($id,$elementid='',$running_process='') { (!empty($running_process)) ? $xml_version = $this->getSystemVersion4RunningProcess($running_process,array('processmaker','xml_version')) : $xml_version = ''; $data = $this->retrieve($id, $xml_version); $vte_metadata = Zend_Json::decode($data['vte_metadata']); if (!empty($elementid)) return $vte_metadata[$elementid]; else return $vte_metadata; } //crmv@160805 function getMetaRecords($id,$elementid='',$running_process='') { global $adb, $table_prefix; (!empty($running_process)) ? $xml_version = $this->getSystemVersion4RunningProcess($running_process,array('processmaker','xml_version')) : $xml_version = ''; if (!empty($xml_version)) { $query = "SELECT id, elementid, text, type, module, action, start FROM {$table_prefix}_processmaker_metarec_vh WHERE versionid = ? and processid = ?"; $params = array($xml_version, $processid); } else { $query = "SELECT id, elementid, text, type, module, action, start FROM {$table_prefix}_processmaker_metarec WHERE processid = ?"; $params = array($id); } if (!empty($elementid)) { $query .= " and elementid = ?"; $params[] = $elementid; } $metas = array(); $result = $adb->pquery($query, $params); if ($result && $adb->num_rows($result) > 0) { while ($row = $adb->fetchByAssoc($result, -1, false)) { $metas[$row['elementid']] = $row; } } return $metas; } //crmv@160805e //crmv@153321_5 function formatMetadata($id,$elementid,$vte_metadata,$helper=array(),$dynaform=null) { $data = array(); $vte_metadata = Zend_Json::decode($vte_metadata); // format values $structure = $this->getStructureElementInfo($id,$elementid,'shapes'); if ($structure['type'] == 'StartEvent' && $structure['subType'] == 'TimerEventDefinition') { $vte_metadata['date_start'] = getValidDBInsertDateValue($vte_metadata['date_start']); $vte_metadata['date_end'] = getValidDBInsertDateValue($vte_metadata['date_end']); } //crmv@182148 if ($structure['type'] == 'IntermediateCatchEvent' && $structure['subType'] == 'TimerEventDefinition') { $vte_metadata['trigger_date_value'] = getValidDBInsertDateValue($vte_metadata['trigger_date_value']); } //crmv@182148e if (!empty($vte_metadata)) { $data['vte_metadata'] = Zend_Json::encode(array($elementid=>$vte_metadata)); } if (!empty($helper)) { $helper = Zend_Json::decode($helper); if ($helper['assigntype'] == 'U') $helper['assigned_user_id'] = $helper['assigned_user_id']; elseif($helper['assigntype'] == 'T') $helper['assigned_user_id'] = $helper['assigned_group_id']; elseif($helper['assigntype'] == 'O' || $helper['assigntype'] == 'A') $helper['assigned_user_id'] = $helper['other_assigned_user_id']; //crmv@160843 unset($helper['assigntype']); unset($helper['assigned_user_id_display']); unset($helper['assigned_group_id']); unset($helper['assigned_group_id_display']); unset($helper['other_assigned_user_id']); if (!empty($dynaform)) $helper['dynaform'] = $dynaform; //crmv@106856 if ($helper['assigned_user_id'] == 'advanced_field_assignment') { $tmp = $this->getAdvancedFieldAssignment('assigned_user_id');; if (!empty($tmp)) $helper['advanced_field_assignment']['assigned_user_id'] = $tmp; } //crmv@106856e //crmv@160843 if($helper['process_status_type'] == 'o') { $helper['process_status'] = $helper['other_process_status']; unset($helper['process_status_type']); unset($helper['other_process_status']); } //crmv@160843e $data['helper'] = Zend_Json::encode(array($elementid=>$helper)); } return $data; } function saveMetadata($id,$elementid,$vte_metadata,$helper=array(),$dynaform=null) { $data = $this->formatMetadata($id,$elementid,$vte_metadata,$helper,$dynaform); $data['pending_changes'] = 1; $this->edit($id,$data); } //crmv@153321_5e //crmv@97575 function setSubprocess($id,$elementid,$subprocess) { global $adb, $table_prefix; // TODO use only the table _processmaker_rel and delete the _subprocesses $adb->pquery("delete from {$table_prefix}_subprocesses where processid = ? and elementid = ?",array($id,$elementid)); $adb->pquery("insert into {$table_prefix}_subprocesses(processid,elementid,subprocess) values(?,?,?)",array($id,$elementid,$subprocess)); $result = $adb->pquery("select id from {$table_prefix}_processmaker_rel where processid = ? and elementid = ?",array($id,$elementid)); if ($result && $adb->num_rows($result) > 0) { $adb->pquery("update {$table_prefix}_processmaker_rel set related = ?, related_role = ? where id = ?",array($subprocess,'son',$adb->query_result($result,0,'id'))); } else { $adb->pquery("insert into {$table_prefix}_processmaker_rel(id,processid,elementid,related,related_role) values(?,?,?,?,?)",array($adb->getUniqueID("{$table_prefix}_processmaker_rel"),$id,$elementid,$subprocess,'son')); } $result = $adb->pquery("select id from {$table_prefix}_processmaker_rel where related = ? and elementid = ?",array($id,$elementid)); if ($result && $adb->num_rows($result) > 0) { $adb->pquery("update {$table_prefix}_processmaker_rel set processid = ?, related_role = ? where id = ?",array($subprocess,'father',$adb->query_result($result,0,'id'))); } else { $adb->pquery("insert into {$table_prefix}_processmaker_rel(id,processid,elementid,related,related_role) values(?,?,?,?,?)",array($adb->getUniqueID("{$table_prefix}_processmaker_rel"),$subprocess,$elementid,$id,'father')); } } //crmv@136524 function unsetSubprocess($id,$elementid) { global $adb, $table_prefix; $adb->pquery("delete from {$table_prefix}_subprocesses where processid = ? and elementid = ?",array($id,$elementid)); $adb->pquery("delete from {$table_prefix}_processmaker_rel where processid = ? and elementid = ? and related_role = ?",array($id,$elementid,'son')); $adb->pquery("delete from {$table_prefix}_processmaker_rel where related = ? and elementid = ? and related_role = ?",array($id,$elementid,'father')); } //crmv@136524e function getSubprocesses($id,$elementid='') { global $adb, $table_prefix; $query = "select {$table_prefix}_subprocesses.*, {$table_prefix}_processmaker.name from {$table_prefix}_subprocesses inner join {$table_prefix}_processmaker on {$table_prefix}_processmaker.id = {$table_prefix}_subprocesses.subprocess where {$table_prefix}_subprocesses.processid = ?"; $params = array($id); if (!empty($elementid)) { $query .= " and elementid = ?"; $params[] = $elementid; } $result = $adb->pquery($query,$params); if ($result && $adb->num_rows($result) > 0) { $return = array(); while($row=$adb->fetchByAssoc($result)) { if (!empty($elementid)) return $row; else $return[$row['elementid']] = $row; } return $return; } return false; } function getRelatedProcess($id,$meta='') { global $adb, $table_prefix; $query = "select {$table_prefix}_processmaker_rel.*, {$table_prefix}_processmaker.name from {$table_prefix}_processmaker_rel inner join {$table_prefix}_processmaker on {$table_prefix}_processmaker.id = {$table_prefix}_processmaker_rel.related where {$table_prefix}_processmaker_rel.processid = ?"; $params = array($id); if (!empty($meta)) { $query .= " and {$table_prefix}_processmaker_rel.id = ?"; $params[] = $meta; } $result = $adb->pquery($query,$params); if ($result && $adb->num_rows($result) > 0) { $return = array(); while($row=$adb->fetchByAssoc($result)) { $return[$row['related']] = $row; // $return[] = $row; //crmv@161211 TODO } return $return; } return false; } function clearSubProcesses($processid,&$vte_metadata,$structure) { //crmv@136524 $vte_metadata = Zend_Json::decode($vte_metadata); $structure = Zend_Json::decode($structure); foreach($vte_metadata as $elementid => &$metadata) { if ($structure['shapes'][$elementid]['type'] == 'SubProcess') { unset($metadata['subprocess']); } } $vte_metadata = Zend_Json::encode($vte_metadata); } function relateSubProcessesRun($running_processes) { global $adb, $table_prefix; if (!empty($running_processes)) { $all_running_process = array(); foreach($running_processes as $info) { $all_running_process[$info['running_process']] = $info['processid']; } foreach($running_processes as $info) { if ($info['new']) { $new_running_process = $info['running_process']; $result = $adb->pquery("SELECT processid FROM {$table_prefix}_subprocesses INNER JOIN {$table_prefix}_running_processes ON {$table_prefix}_running_processes.processmakerid = {$table_prefix}_subprocesses.subprocess WHERE {$table_prefix}_running_processes.id = ?", array($new_running_process)); if ($result && $adb->num_rows($result) > 0) { $father_processid = $adb->query_result($result,0,'processid'); $father_running_process = array_search($father_processid, $all_running_process); if ($father_running_process !== false) { // set the father of the new running process $adb->pquery("update {$table_prefix}_running_processes set father = ? where id = ?", array($father_running_process,$new_running_process)); // set the father in the Processes record (if exists) $father = $this->getProcessFatherRun($new_running_process); if (!empty($father)) { $adb->pquery("update {$table_prefix}_processes set father = ? where running_process = ?", array($father,$new_running_process)); } } } } } } } function getProcessFatherRun($running_process='') { global $adb, $table_prefix; $result = $adb->pquery("SELECT {$table_prefix}_processes.processesid FROM {$table_prefix}_running_processes INNER JOIN {$table_prefix}_processes ON {$table_prefix}_processes.running_process = {$table_prefix}_running_processes.father WHERE {$table_prefix}_running_processes.id = ?", array($running_process)); if ($result && $adb->num_rows($result) > 0) { return $adb->query_result($result,0,'processesid'); } return false; } function getRelatedRunningProcess($running_process, $processid, $meta_processid = '') { // crmv@206002 global $adb, $table_prefix; $this->relateSubProcessesRun(ProcessMakerHandler::$running_processes); // try to set sub processes $related = $this->getRelatedProcess($processid,$meta_processid); if ($related !== false) { $related = array_shift($related); if ($related['related_role'] == 'father') { $result = $adb->pquery("SELECT rel.id FROM {$table_prefix}_running_processes running_processes INNER JOIN {$table_prefix}_running_processes rel ON rel.id = running_processes.father WHERE running_processes.id = ? AND rel.processmakerid = ?", array($running_process,$related['related'])); } elseif ($related['related_role'] == 'son') { $result = $adb->pquery("SELECT rel.id FROM {$table_prefix}_running_processes running_processes INNER JOIN {$table_prefix}_running_processes rel ON rel.father = running_processes.id WHERE running_processes.id = ? AND rel.processmakerid = ?", array($running_process,$related['related'])); } if ($result && $adb->num_rows($result) > 0) { $running_process = $adb->query_result($result,0,'id'); } return $running_process; } return false; } //crmv@97575e function clearRecordsInvolved($id) { global $adb, $table_prefix; $adb->pquery("delete from {$table_prefix}_processmaker_metarec where processid = ?", array($id)); } // crmv@200009 crmv@204903 function setRecordInvolved($id,$elementid,$text,$type,$module,$action,$start=0,$module2='',$exec_cond='') { global $adb, $table_prefix, $default_charset; //crmv@132240 $result = $adb->pquery("select id from {$table_prefix}_processmaker_metarec where processid = ? and elementid = ? and action = ? and module = ?", array($id,$elementid,$action,$module)); if ($result && $adb->num_rows($result) > 0) { $metarecid = $adb->query_result($result,0,'id'); $adb->pquery("update {$table_prefix}_processmaker_metarec set module = ?, action = ?, start = ? where id = ? and processid = ? and elementid = ? and module = ?", array($module,$action,$start,$metarecid,$id,$elementid,$module)); } else { $metarecid = $adb->getUniqueID("{$table_prefix}_processmaker_metarec"); $adb->pquery("insert into {$table_prefix}_processmaker_metarec values (?,?,?,?,?,?,?,?)", array($metarecid,$id,$elementid,html_entity_decode($text,ENT_QUOTES,$default_charset),$type,$module,$action,$start)); } if ($exec_cond == 'ON_RELATE_RECORD' && $module2 != '') { $result2 = $adb->limitpquery("select id from {$table_prefix}_processmaker_metarec where processid = ? and elementid = ? and action = ? and module <> ? ORDER BY id DESC", 0, 1, array($id,$elementid,$action, $module)); if ($result2 && $adb->num_rows($result2) > 0) { $metarecid2 = $adb->query_result($result2,0,'id'); $adb->pquery("update {$table_prefix}_processmaker_metarec set module = ?, action = ?, start = ? where id = ? and processid = ? and elementid = ?", array($module2,$action,0,$metarecid2,$id,$elementid)); } else { $metarecid2 = $adb->getUniqueID("{$table_prefix}_processmaker_metarec"); $adb->pquery("insert into {$table_prefix}_processmaker_metarec values (?,?,?,?,?,?,?,?)", array($metarecid2,$id,$elementid,html_entity_decode($text,ENT_QUOTES,$default_charset),$type,$module2,$action,0)); //crmv@132240 } } } // crmv@200009e crmv@204903e function getRecordsInvolvedLabel($processid,$metaid,$row=array(),$related=false) { if (empty($row)) { global $adb, $table_prefix; $result = $adb->pquery("select * from {$table_prefix}_processmaker_metarec where id = ? and processid = ?", array($metaid,$processid)); if ($result && $adb->num_rows($result) > 0) { $row = $adb->fetch_array_no_html($result); } } $label = '[$'.$row['id'].'] '.getTranslatedString($row['module'],$row['module']).' ('.$this->formatType($row['type'],true).': '.trim($row['text']).')'; if ($related !== false) { /* crmv@161211 TODO $structure = $this->getStructure($processid); $related_label = $this->getElementTitle($structure['shapes'][$related['elementid']]); $label = '('.$related_label.') '.$label; */ $label = $related['name'].' '.$label; //crmv@139690 } return $label; } function getRecordsInvolved($id,$related=false,$elementid='',$action='',$inventory_filter=false) { // crmv@195745 global $adb, $table_prefix; $query = "select * from {$table_prefix}_processmaker_metarec where processid = ?"; $params = array($id); if (!empty($elementid)) { $query .= " and elementid = ?"; $params[] = $elementid; } if ($action !== '') { $query .= " and action = ?"; $params[] = $action; } // crmv@195745 if ($inventory_filter) { $inventory_modules = getInventoryModules(); $query .= " and module in (".generateQuestionMarks($inventory_modules).")"; $params[] = $inventory_modules; } // crmv@195745e $result = $adb->pquery($query,$params); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { if ($row['start'] == '1' && empty($row['module'])) continue; //crmv@160368 hide record if start condition is ON_SUBPROCESS $records[] = array( 'seq'=>$row['id'], 'id'=>$row['elementid'], 'text'=>$row['text'], 'type'=>$row['type'], 'module'=>$row['module'], 'action'=>$row['action'], 'translatedModule'=>getTranslatedString($row['module'],$row['module']), 'label'=>$this->getRecordsInvolvedLabel($id,$row['id'],$row), ); } } //crmv@98809 if ($related) { $processes = $this->getRelatedProcess($id); if (!empty($processes)) { foreach($processes as $info) { // crmv@195745 $query = "select * from {$table_prefix}_processmaker_metarec where processid = ?"; $params = array($info['related']); if ($inventory_filter) { $query .= " and module in (".generateQuestionMarks($inventory_modules).")"; $params[] = $inventory_modules; } $result = $adb->pquery($query, $params); // crmv@195745e if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { if ($row['start'] == '1' && empty($row['module'])) continue; //crmv@160368 crmv@161211 hide record if start condition is ON_SUBPROCESS $records[] = array( 'meta_processid'=>$info['id'], 'seq'=>$row['id'], 'id'=>$row['elementid'], 'text'=>$row['text'], 'type'=>$row['type'], 'module'=>$row['module'], 'action'=>$row['action'], 'translatedModule'=>getTranslatedString($row['module'],$row['module']), 'label'=>$this->getRecordsInvolvedLabel($id,$row['id'],$row,$info), ); } } } } } //crmv@98809e return $records; } function getRecordsInvolvedModules($id, $related=false, $add_reference=false) { $involved_records = $this->getRecordsInvolved($id,$related); $modules_involved_records = array(); if (!empty($involved_records)) { foreach($involved_records as $involved_record) { if (!in_array($involved_record['module'],$this->versioning_skip_modules) && !in_array($involved_record['module'],$modules_involved_records)) $modules_involved_records[] = $involved_record['module']; //crmv@180014 if ($add_reference) { $relationManager = RelationManager::getInstance(); $relationsN1 = $relationManager->getRelations($involved_record['module'], ModuleRelation::$TYPE_NTO1); if (!empty($relationsN1)) { foreach($relationsN1 as $rel) { if (!in_array($rel->getSecondModule(),$this->versioning_skip_modules) && !in_array($rel->getSecondModule(),$modules_involved_records)) $modules_involved_records[] = $rel->getSecondModule(); //crmv@180014 } } } } } return $modules_involved_records; } function getRecordsInvolvedOptions($id, $selected_value='', $startTask=false, $excluded_values=array(), $onlyModules = array(), $add_reference=false, $inventory_filter=false) { // crmv@126696 crmv@135190 crmv@195745 global $adb, $table_prefix; //crmv@135190 $records = $this->getRecordsInvolved($id,true,'','',$inventory_filter); //crmv@160368 crmv@195745 $values = array(''=>array(getTranslatedString('LBL_PLEASE_SELECT'),'')); if ($startTask) { ($selected_value == 'current') ? $selected = 'selected' : $selected = ''; $values['current'] = array(getTranslatedString('LBL_PMH_CURRENT_ENTITY','Settings'), $selected); } else { if (!empty($records)) { foreach($records as $r) { $key = $r['seq'].':'.$r['module'].((empty($r['meta_processid']))?'':'::'.$r['meta_processid']); //crmv@160368 if (!empty($onlyModules) && !in_array($r['module'], $onlyModules)) continue; // crmv@126696 if (!empty($excluded_values) && in_array($key,$excluded_values)) continue; ($selected_value == $key) ? $selected = 'selected' : $selected = ''; //crmv@135190 if ($add_reference) { $tmp_values = array(); if (empty($referenceInfo[$r['module']])) { // crmv@195745 ($inventory_filter) ? $relmodules = getInventoryModules() : $relmodules = array(); $relationManager = RelationManager::getInstance(); $relationsN1 = $relationManager->getRelations($r['module'], ModuleRelation::$TYPE_NTO1, $relmodules); // crmv@195745e if (!empty($relationsN1)) { $referenceInfo[$r['module']] = array(); foreach($relationsN1 as $rel) { if (!isset($referenceInfo[$r['module']][$rel->fieldid])) { $result = $adb->pquery("select fieldlabel from {$table_prefix}_field where fieldid = ?", array($rel->fieldid)); if ($result && $adb->num_rows($result) > 0) { $referenceInfo[$r['module']][$rel->fieldid] = array( 'fieldid'=>$rel->fieldid, 'fieldlabel'=>getTranslatedString($adb->query_result($result,0,'fieldlabel'),$rel->getFirstModule()), ); } } } } } $tmp_values[$key] = array('ID', $selected); if (!empty($referenceInfo[$r['module']])) { foreach($referenceInfo[$r['module']] as $rr) { //crmv@160368 crmv@160859 $relatedmodres = $adb->pquery("SELECT relmodule FROM ".$table_prefix."_fieldmodulerel WHERE fieldid=?", Array($rr['fieldid'])); if ($relatedmodres && $adb->num_rows($relatedmodres) > 1) { // check for multiple related modules while($row_relmod=$adb->fetchByAssoc($relatedmodres)) { $referenceKey = $r['seq'].':'.$r['module'].':'.$rr['fieldid'].':'.$r['meta_processid'].':'.$row_relmod['relmodule']; ($selected_value == $referenceKey) ? $selected = 'selected' : $selected = ''; $tmp_values[$referenceKey] = array($rr['fieldlabel'].' ('.getTranslatedString($row_relmod['relmodule'],$row_relmod['relmodule']).')', $selected); } } else { $referenceKey = $r['seq'].':'.$r['module'].':'.$rr['fieldid'].((empty($r['meta_processid']))?'':':'.$r['meta_processid']); ($selected_value == $referenceKey) ? $selected = 'selected' : $selected = ''; $tmp_values[$referenceKey] = array($rr['fieldlabel'], $selected); } //crmv@160368e crmv@160859e } } $values[] = array( 'group'=>$r['label'], 'values'=>$tmp_values, ); } else { $values[$key] = array($r['label'], $selected); } //crmv@135190e } } } return $values; } function getOwnerFieldOptions($id, $selected_value='', $startTask=false, $related=false) { global $adb, $table_prefix, $app_strings; $records = $this->getRecordsInvolved($id,$related); $values = array(); $values[''][''] = array(getTranslatedString('LBL_PLEASE_SELECT'),''); if ($startTask) { ($selected_value == 'current') ? $selected = 'selected' : $selected = ''; $values['']['current'] = array(getTranslatedString('LBL_PMH_CURRENT_ENTITY','Settings'), $selected); } else { if (!empty($records)) { foreach($records as $r) { $moduleInstance = Vtecrm_Module::getInstance($r['module']); $result = $adb->pquery("select fieldname, fieldlabel from {$table_prefix}_field where tabid = ? and uitype in (?,?,?,?,?)", array($moduleInstance->id,53,52,51,50,77)); //crmv@101683 if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $key = $r['meta_processid'].':'.$r['seq'].':'.$r['module'].':'.$row['fieldname']; ($selected_value == $key) ? $selected = 'selected' : $selected = ''; $values[$r['label']][$key] = array(getTranslatedString($row['fieldlabel'],$r['module']), $selected); } } } } } //crmv@100591 $elementsActors = $this->getElementsActors($id); if (!empty($elementsActors)) { foreach($elementsActors as $key => $value) { ($selected_value == $key) ? $selected = 'selected' : $selected = ''; $values[$app_strings['LBL_PM_ELEMENTS_ACTORS']][$key] = array($value, $selected); } } //crmv@100591e return $values; } /* * crmv@109589 * if vte_metadata is not empty remove shapes deleted from vte_metadata, helper, vte_processmaker_metarec, vte_process_dynaform_meta, ecc. */ function saveStructure($id,$value) { global $adb, $table_prefix, $default_charset; //crmv@132240 $columns = array('structure = ?'); $values = array($value); $structure = Zend_Json::decode($value); $shapes = array_keys($structure['shapes']); $retrieve = $this->retrieve($id); $vte_metadata = Zend_Json::decode($retrieve['vte_metadata']); if (!empty($vte_metadata)) { foreach($vte_metadata as $elementid => $info) { if (!in_array($elementid,$shapes)) { unset($vte_metadata[$elementid]); } } $columns[] = 'vte_metadata = ?'; $values[] = Zend_Json::encode($vte_metadata); } $helper = Zend_Json::decode($retrieve['helper']); if (!empty($helper)) { foreach($helper as $elementid => $info) { if (!in_array($elementid,$shapes)) { unset($helper[$elementid]); } } $columns[] = 'helper = ?'; $values[] = Zend_Json::encode($helper); } $adb->pquery("update {$this->table_name} set ".implode(',',$columns)." where id = ?", array($values,$id)); // clean _processmaker_metarec $result = $adb->pquery("select id, elementid from {$table_prefix}_processmaker_metarec where processid = ?", array($id)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { if (!in_array($row['elementid'],$shapes)) { // TODO delete from other tables (ex. _processmaker_rec) $adb->pquery("delete from {$table_prefix}_processmaker_metarec where id = ? and processid = ?", array($row['id'],$id)); } } } // clean _process_dynaform_meta $result = $adb->pquery("select id, elementid from {$table_prefix}_process_dynaform_meta where processid = ?", array($id)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { if (!in_array($row['elementid'],$shapes)) { // TODO delete from other tables (ex. _process_dynaform) $adb->pquery("delete from {$table_prefix}_process_dynaform_meta where id = ? and processid = ?", array($row['id'],$id)); } } } // crmv@146671 // clean _process_extws_meta $result = $adb->pquery("select id, elementid from {$table_prefix}_process_extws_meta where processid = ?", array($id)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { if (!in_array($row['elementid'],$shapes)) { $adb->pquery("delete from {$table_prefix}_process_extws_meta where id = ? and processid = ?", array($row['id'],$id)); } } } // crmv@146671e //crmv@136524 clean subprocesses $result = $adb->pquery("select elementid from {$table_prefix}_subprocesses where processid = ?", array($id)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { if (!in_array($row['elementid'],$shapes)) { $this->unsetSubprocess($id, $row['elementid']); } } } //crmv@136524e //crmv@110601 update meta info $adb->pquery("update {$table_prefix}_processmaker_metarec set start = ? where processid = ?", array(0,$id)); foreach($structure['shapes'] as $shapeid => $shape) { $adb->pquery("update {$table_prefix}_processmaker_metarec set type = ?, text = ? where processid = ? and elementid = ?", array($shape['type'],html_entity_decode($shape['text'],ENT_QUOTES,$default_charset),$id,$shapeid)); //crmv@132240 $adb->pquery("update {$table_prefix}_process_dynaform_meta set type = ?, text = ? where processid = ? and elementid = ?", array($shape['type'],html_entity_decode($shape['text'],ENT_QUOTES,$default_charset),$id,$shapeid)); //crmv@132240 // crmv@199886: removed crmv@146671 if ($shape['type'] == 'StartEvent') { $outgoing = $this->getOutgoing($id,$shapeid); foreach($outgoing as $out) { $adb->pquery("update {$table_prefix}_processmaker_metarec set start = ? where processid = ? and elementid = ?", array(1,$id,$out['shape']['id'])); } } } //crmv@110601e } // crmv@129138 function getStructure($id,$running_process='') { global $adb, $table_prefix; static $structCache = array(); if (empty($running_process)) $running_process = 'curr'; if (!isset($structCache[$id][$running_process])) { ($running_process != 'curr') ? $pmvh_id = $this->getSystemVersion4RunningProcess($running_process,array('processmaker','xml_version')) : $pmvh_id = ''; if (!empty($pmvh_id)) { $result = $adb->pquery("select structure from {$table_prefix}_processmaker_versions where processmakerid = ? and xml_version = ?", array($id,$pmvh_id)); } else { $result = $adb->pquery("select structure from {$this->table_name} where id = ?", array($id)); } if ($result && $adb->num_rows($result) > 0) { $structCache[$id][$running_process] = Zend_Json::decode($adb->query_result_no_html($result,0,'structure')); } else { $structCache[$id][$running_process] = false; } } return $structCache[$id][$running_process]; } // crmv@129138e //crmv@185361 function getStructureElementInfo($id,$elementId,$type,$running_process='') { $structure = $this->getStructure($id,$running_process); if (isset($structure[$type][$elementId])) return array_merge(array('id'=>$elementId),$structure[$type][$elementId]); else return false; } //crmv@185361e function getIncoming($id,$shapeid,$running_process='') { $return = array(); $structure = $this->getStructure($id,$running_process); $outgoing = $structure['tree'][$shapeid]['incoming']; if (!empty($outgoing)) { foreach($outgoing as $connection => $shape) { $return[] = array('connection'=>$this->getStructureElementInfo($id,$connection,'connections',$running_process),'shape'=>$this->getStructureElementInfo($id,$shape,'shapes',$running_process)); } } return $return; } function getOutgoing($id,$shapeid,$running_process='') { $return = array(); $structure = $this->getStructure($id,$running_process); $outgoing = $structure['tree'][$shapeid]['outgoing']; if (!empty($outgoing)) { foreach($outgoing as $connection => $shape) { $connection_info = $this->getStructureElementInfo($id,$connection,'connections',$running_process); if (in_array($connection_info['type'],array('SequenceFlow','MessageFlow'))) { // SequenceFlow is the standard arrow, MessageFlow is for link Participants $return[] = array('connection'=>$connection_info,'shape'=>$this->getStructureElementInfo($id,$shape,'shapes',$running_process)); } } } return $return; } //crmv@103534 function getParallelFlowSons($id,$running_process,$gateway,$elementid,&$elementsons,&$conditionssons) { static $checkInfiniteLoops = array(); $structure = $this->getStructureElementInfo($id,$elementid,'shapes',$running_process); if ($elementid == $gateway || $this->isEndTask($structure['type']) || $structure['type'] == 'ParallelGateway' || ($this->getEngineType($structure) == 'Gateway' && $elementid == $this->getClosingParallelGateway($id,$gateway,$running_process))) { if ($structure['type'] == 'ParallelGateway') { // add also the next Parallel Gateway before end the recursion $elementsons[] = $elementid; } return; } else { if (!isset($checkInfiniteLoops[$id][$gateway][$elementid])) { $checkInfiniteLoops[$id][$gateway][$elementid] = 0; } if ($this->getEngineType($structure) == 'Action') { if (!in_array($elementid,$elementsons)) $elementsons[] = $elementid; else $checkInfiniteLoops[$id][$gateway][$elementid]++; } if ($this->getEngineType($structure) == 'Condition') { if (!in_array($elementid,$conditionssons)) $conditionssons[] = $elementid; else $checkInfiniteLoops[$id][$gateway][$elementid]++; } if ($checkInfiniteLoops[$id][$gateway][$elementid] > 10) { return; } $outgoings = $this->getOutgoing($id,$elementid,$running_process); if (!empty($outgoings)) { foreach($outgoings as $outgoing) { $this->getParallelFlowSons($id,$running_process,$gateway,$outgoing['shape']['id'],$elementsons,$conditionssons); } } } } function getClosingParallelGateway($id,$gateway,$running_process) { $metadata = $this->getMetadata($id,$gateway,$running_process); return $metadata['closing_gateway']; } function searchParentParallelFlow($running_process,$gateway) { global $adb, $table_prefix; $result = $adb->pquery("select processesid, elementsons from {$table_prefix}_process_gateway_conn where running_process = ? and elementid <> ?", array($running_process,$gateway)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result,-1,false)) { $elementsons = Zend_Json::decode($row['elementsons']); if (in_array($gateway,$elementsons)) { // the gateway is son of this flow return $row['processesid']; } } } return false; } //crmv@103534e function actionEdit($id,$elementid,$action_type,$action_id='', $actionOptions = array()){ global $mod_strings, $app_strings, $theme; $actionType = $this->getActionTypes($action_type); require_once($actionType['php_file']); $action = new $actionType['class']($actionOptions); $smarty = new VteSmarty(); $smarty->assign('THEME',$theme); $smarty->assign('APP',$app_strings); $smarty->assign('MOD',$mod_strings); $smarty->assign("PAGE_TITLE", $mod_strings['LBL_PM_ACTION'].": ".$mod_strings['LBL_PM_ACTION_'.$action_type]); $smarty->assign("HEADER_Z_INDEX", 1); $buttons = '
'; $smarty->assign("BUTTON_LIST", $buttons); include_once('vtlib/Vtecrm/Link.php'); $COMMONHDRLINKS = Vtecrm_Link::getAllByType(Vtecrm_Link::IGNORE_MODULE, Array('HEADERSCRIPT')); $smarty->assign('HEADERSCRIPTS', $COMMONHDRLINKS['HEADERSCRIPT']); //crmv@131239 $JSGlobals = ( function_exists('getJSGlobalVars') ? getJSGlobalVars() : array() ); $smarty->assign('JS_GLOBAL_VARS', Zend_Json::encode($JSGlobals)); //crmv@131239e $smarty->assign('ID',$id); $smarty->assign('ELEMENTID',$elementid); $smarty->assign('ACTIONTYPE',$action_type); $smarty->assign('ACTIONID',$action_id); $smarty->assign('TEMPLATE',$actionType['tpl_file']); $action->edit($smarty,$id,$elementid,$this->retrieve($id),$action_type,$action_id); $smarty->display("Settings/ProcessMaker/Metadata/ActionTaskEdit.tpl"); include('themes/SmallFooter.php'); } // crmv@146671 function actionSave($request){ $action_type = vtlib_purify($request['meta_action']['action_type']); $actionType = $this->getActionTypes($action_type); if (!empty($actionType)) { require_once($actionType['php_file']); $actionOptions = array(); $action = new $actionType['class']($actionOptions); } // use the base class in case it's not extended properly if (empty($actionType) || !method_exists($action, 'save')) { require_once('modules/Settings/ProcessMaker/actions/Base.php'); $action = new PMActionBase($actionOptions); } //crmv@153321_5 clear only the processmaker_entity_options_ session beacause the processmaker_describe_modules_ session will be add the new module automatically if (in_array($action_type,array('Create','Update')) && $request['action_id'] !== '') { $retrieve = $this->retrieve($request['id']); $element_metadata = Zend_Json::decode($retrieve['vte_metadata']); $saved_meta_action = $element_metadata[$request['elementid']]['actions'][$request['action_id']]; } if (empty($request['action_id']) // on create of a new action || $action_type == 'CallExtWS' // on create or update of CallExtWS || ($action_type == 'Create' && $request['meta_action']['form_module'] != $saved_meta_action['form_module']) // on change of the module to create || ($action_type == 'Update' && $request['meta_action']['record_involved'] != $saved_meta_action['record_involved']) // on change of the record to update ) { $this->clearCache('processmaker_entity_options_'.$request['id']); } //crmv@153321_5e return $action->save($request); } // crmv@146671e function actionDelete($id,$elementid,$action_id){ $retrieve = $this->retrieve($id); $element_metadata = Zend_Json::decode($retrieve['vte_metadata']); unset($element_metadata[$elementid]['actions'][$action_id]); $retrieve['vte_metadata'] = Zend_Json::encode($element_metadata); $retrieve['pending_changes'] = 1; $this->edit($id,$retrieve); $PMUtils = ProcessMakerUtils::getInstance(); $record_involved = $this->getRecordsInvolved($id,false,$elementid,$action_id); $metaid = $record_involved[0]['seq']; if ($metaid !== '') { global $adb, $table_prefix; $adb->pquery("delete from {$table_prefix}_processmaker_metarec where id = ? and processid = ?", array($metaid,$id)); $adb->pquery("delete from {$table_prefix}_processmaker_rec where id = ?", array($metaid)); } //crmv@153321_5 clear only the processmaker_entity_options_ session beacause the processmaker_describe_modules_ session will be add the new module automatically $this->clearCache('processmaker_entity_options_'.$id); } //crmv@108227 crmv@106857 function getModuleList($mode='',$selectedvalue='') { global $adb, $table_prefix; $modules_not_supported = $this->modules_not_supported; // skip also light modules require_once('include/utils/ModLightUtils.php'); $MLUtils = ModLightUtils::getInstance(); $light_modules = $MLUtils->getModuleList(); if (!empty($light_modules)) $modules_not_supported = array_merge($modules_not_supported,$light_modules); $sql="select distinct {$table_prefix}_field.tabid, name from {$table_prefix}_field inner join {$table_prefix}_tab on {$table_prefix}_field.tabid={$table_prefix}_tab.tabid where {$table_prefix}_tab.name not in (".generateQuestionMarks($modules_not_supported).") and {$table_prefix}_tab.isentitytype=1 and {$table_prefix}_tab.presence in (0,2)"; $it = new SqlResultIterator($adb, $adb->pquery($sql,array($modules_not_supported))); if ($mode == 'picklist') { $modules = array(''=>array(getTranslatedString('LBL_NONE'),'')); foreach($it as $row){ ($selectedvalue == $row->name) ? $selected = 'selected' : $selected = ''; $modules[$row->name] = array(getSingleModuleName($row->name),$selected); } asort($modules); } else { $modules = array(); foreach($it as $row){ $modules[] = $row->name; } } return $modules; } //crmv@108227e crmv@106857e function translateConditionFieldname($fieldname, $module, $processmakerid='', $metaid='', $running_process='') { global $adb, $table_prefix; $related_module = false; if (strpos($fieldname,' : ') !== false && strpos($fieldname,' (') !== false && strpos($fieldname,') ') !== false) { list($columnname,$tmp) = explode(' : ',$fieldname); list($module,$fieldname) = explode(') ',$tmp); $module = ltrim($module,'('); $related_module = true; } if ($module == 'DynaForm') { require_once('modules/Settings/ProcessMaker/ProcessDynaForm.php'); $processDynaFormObj = ProcessDynaForm::getInstance(); $blocks = $processDynaFormObj->getStructure($processmakerid, false, $metaid, $running_process); if (!empty($blocks)) { foreach($blocks as $block) { foreach($block['fields'] as $field) { if ($field['fieldname'] == $fieldname) { $trans_field = $field['label']; if ($related_module) $trans_field .= ' ('.getSingleModuleName($module).')'; break(2); } } } } } else { $moduleInstance = Vtecrm_Module::getInstance($module); $result = $adb->pquery("select fieldlabel from {$table_prefix}_field where tabid = ? and fieldname = ?", array($moduleInstance->id,$fieldname)); if ($result && $adb->num_rows($result) > 0) { $trans_field = getTranslatedString($adb->query_result($result,0,'fieldlabel'),$module); if ($related_module) $trans_field .= ' ('.getSingleModuleName($module).')'; } } return $trans_field; } function translateConditionOperation($value) { global $adb, $current_language; $labels = array( 'is'=>'EQUALS', 'equal to'=>'EQUALS', 'is not'=>'NOT_EQUALS_TO', 'does not equal'=>'NOT_EQUALS_TO', 'has changed'=>'HAS_CHANGED', //crmv@56962 'contains'=>'CONTAINS', 'does not contain'=>'DOES_NOT_CONTAINS', 'starts with'=>'STARTS_WITH', 'ends with'=>'ENDS_WITH', //crmv@56962 'less than'=>'LESS_THAN', 'greater than'=>'GREATER_THAN', 'less than or equal to'=>'LESS_OR_EQUALS', 'greater than or equal to'=>'GREATER_OR_EQUALS', ); static $trans_labels = array(); if (empty($trans_labels)) { $res = $adb->pquery("select module, label, trans_label from sdk_language where language = ? and module = ? and label in (".generateQuestionMarks($labels).") order by module", array($current_language,'ALERT_ARR',$labels)); if ($res && $adb->num_rows($res) > 0) { while($row=$adb->fetchByAssoc($res,-1,false)) { $trans_labels[$row['label']] = $row['trans_label']; } } } return $trans_labels[$labels[$value]]; } // crmv@129138 public static function getFieldWSType($module, $fieldname) { global $adb, $table_prefix; static $wsCache = array(); $key = $module.'_'.$fieldname; if (!isset($wsCache[$key])) { $moduleInstance = Vtecrm_Module::getInstance($module); $result = $adb->pquery("select * from {$table_prefix}_field where tabid = ? and fieldname = ?", array($moduleInstance->id,$fieldname)); $wsField = WebserviceField::fromQueryResult($adb,$result,0); $wsCache[$key] = $wsField->getFieldDataType(); } return $wsCache[$key]; } // crmv@195745 public static function getFieldRawValue($module, $fieldname, $crmid) { global $adb, $table_prefix; $wsField = WebserviceField::fromCachedWS($module, $fieldname); if ($wsField) { $focus = CRMEntity::getInstance($module); $index = $focus->tab_name_index[$wsField->getTableName()]; $res = $adb->pquery("SELECT {$wsField->getColumnName()} as val FROM {$wsField->getTableName()} WHERE $index = ?", array($crmid)); return $adb->query_result_no_html($res, 0, 'val'); } return null; } // crmv@195745e function translateConditionValue($fieldname, $module, $value) { if (self::getFieldWSType($module, $fieldname) == 'picklist') { $value = getTranslatedString($value,$module); } if ($value == '') $value = getTranslatedString('LBL_EMPTY_LABEL','Charts'); return $value; } // crmv@129138e function translateConditionGlue($glue) { static $trans_glue = array(); if (empty($trans_glue)) { $trans_glue = array( 'and'=>getTranslatedString('LBL_AND'), 'or'=>getTranslatedString('LBL_OR'), ); } return $trans_glue[$glue]; } function translateConditions($id,$elementid,$running_process,$metadata='') { if (empty($metadata)) $metadata = $this->getMetadata($id,$elementid,$running_process); $conditions = Zend_Json::decode($metadata['conditions']); if (strpos($metadata['moduleName'],':') !== false) { list($entityId,$module) = explode(':',$metadata['moduleName']); } else { $module = $metadata['moduleName']; } $c = array(); if (!empty($conditions)) { $i=0; foreach($conditions as $condition) { $sub_conditions = $condition['conditions']; $label = ''; foreach($sub_conditions as $ii => $sub_condition) { $label .= $this->translateConditionFieldname($sub_condition['fieldname'],$module,$id,$entityId,$running_process).' '.$this->translateConditionOperation($sub_condition['operation']).' '.$this->translateConditionValue($sub_condition['fieldname'],$module,$sub_condition['value']).''; if ($ii < count($sub_conditions)) $label .= ' '.$this->translateConditionGlue($sub_condition['glue']).' '; } if ($i < count($conditions)-1) { if (count($sub_conditions) > 1) $label = "($label)"; $label .= ' '.$this->translateConditionGlue($condition['glue']); } $c[] = $label; $i++; } } return $c; } function getGatewayConditions($id,$elementid,$vte_metadata_arr,&$show_required2go_check,$running_process='') { $incoming = $this->getIncoming($id,$elementid,$running_process); $groups = array(); $j = 0; $enable_cond_else = true; //crmv@114116 foreach($incoming as $inc) { $metadata = $this->getMetadata($id,$inc['shape']['id'],$running_process); if ($metadata['execution_condition'] == 'EVERY_TIME') $enable_cond_else = false; //crmv@114116 $conditions = Zend_Json::decode($metadata['conditions']); if (strpos($metadata['moduleName'],':') !== false) { list($entityId,$module) = explode(':',$metadata['moduleName']); } else { $module = $metadata['moduleName']; } $c = array(); if (!empty($conditions)) { $all_or = true; for($i=0;$igetTranslatedString('LBL_EXCLUSIVEGATEWAY_SUCCESS','Settings'),'cond'=>'cond_all','elementid'=>$vte_metadata_arr['cond_all']); } else { $i=0; foreach($conditions as $condition) { $sub_conditions = $condition['conditions']; $label = ''; foreach($sub_conditions as $ii => $sub_condition) { $label .= $this->translateConditionFieldname($sub_condition['fieldname'],$module,$id,$entityId,$running_process).' '.$this->translateConditionOperation($sub_condition['operation']).' '.$this->translateConditionValue($sub_condition['fieldname'],$module,$sub_condition['value']).''; if ($ii < count($sub_conditions)) $label .= ' '.$this->translateConditionGlue($sub_condition['glue']).' '; } $c[] = array( 'label'=>$label, 'cond'=>"cond_{$j}_{$i}", 'elementid'=>$vte_metadata_arr["cond_{$j}_{$i}"], 'json_condition'=>Zend_Json::encode($sub_conditions) ); $i++; } } } if (!empty($c)) { $groups[$j] = array( 'elementid'=>$inc['shape']['id'], 'metaid'=>$metadata['moduleName'], 'name'=>$inc['shape']['text'], 'conditions'=>$c, //'required2go'=>$vte_metadata_arr["required2go_{$j}"], ); } $j++; } if (!empty($groups) && $enable_cond_else) { //crmv@114116 $groups[] = array( 'name'=>'', 'conditions'=>array(array('label'=>getTranslatedString('LBL_EXCLUSIVEGATEWAY_OTHER','Settings'),'cond'=>'cond_else','elementid'=>$vte_metadata_arr['cond_else'])), ); } if ($j > 1) { $show_required2go_check = true; } return $groups; } //crmv@106857 function evaluateCondition($entityCache, $id, $conditions, $cycleIndex=null) { global $current_user; $conditions = Zend_Json::decode($conditions); if (empty($conditions)) return true; $this->debug('Conditions', $conditions, true); // crmv@189728 $PMUtils = ProcessMakerUtils::getInstance(); $PMUtils->setDefaultDataFormat(); $entityData = $entityCache->forId($id); $PMUtils->restoreDataFormat(); $data = $entityData->getData(); $i = 0; $string = "\$result = "; foreach($conditions as $condition) { $string .= '('; $j = 0; foreach($condition['conditions'] as $sub_condition) { if (strpos($sub_condition['fieldname'],'sdk:') !== false) { $sdkTaskConditions = SDK::getProcessMakerTaskConditions(); list($tmp,$sdkId) = explode(':',$sub_condition['fieldname']); if (isset($sdkTaskConditions[$sdkId])) { require_once($sdkTaskConditions[$sdkId]['src']); $return = call_user_func_array($sdkTaskConditions[$sdkId]['funct'], array($entityData->moduleName,$id,$entityData->data)); $entityData->data[$sub_condition['fieldname']] = $return; } } if (strpos($sub_condition['fieldname'],'::') !== false) { list($tfield, $tcol) = explode('::',$sub_condition['fieldname']); if (stripos($tfield,'ml') !== false) { if (empty($id)) { $replacement = $this->applyTableFieldFunct('', $entityData->data[$tfield], $tfield, $tcol.':'.$sub_condition['tabfieldopt'].':'.$sub_condition['tabfieldseq'], $cycleIndex); } else { $replacement = $this->replaceTableFieldTag($id, $tfield, $tcol.':'.$sub_condition['tabfieldopt'].':'.$sub_condition['tabfieldseq']); } } else { $replacement = $this->applyTableFieldFunct('dynaform', $entityData->data[$tfield], $tfield, $tcol.':'.$sub_condition['tabfieldopt'].':'.$sub_condition['tabfieldseq'], $cycleIndex); } require_once("modules/Settings/ProcessMaker/actions/Cycle.php"); require_once("modules/com_workflow/VTJsonCondition.inc");//crmv@207901 //crmv@121616 if (is_array($replacement) && in_array($sub_condition['tabfieldopt'],array('all','at_least_one'))) { $sub_condition_res = false; if (!empty($replacement)) { if ($sub_condition['tabfieldopt'] == 'all') { $sub_condition_res = true; foreach($replacement as $temp_row) { $temp_fieldname = substr($sub_condition['fieldname'],strpos($sub_condition['fieldname'],'::')+2); $tmpEntityCache = new PMCycleWorkflowEntity($current_user, array($sub_condition['fieldname']=>$temp_row[$temp_fieldname])); $workflow_condition = new VTJsonCondition(); if ($workflow_condition->checkCondition($tmpEntityCache, $sub_condition) !== true) { $sub_condition_res = false; break; } } } elseif ($sub_condition['tabfieldopt'] == 'at_least_one') { foreach($replacement as $temp_row) { $temp_fieldname = substr($sub_condition['fieldname'],strpos($sub_condition['fieldname'],'::')+2); $tmpEntityCache = new PMCycleWorkflowEntity($current_user, array($sub_condition['fieldname']=>$temp_row[$temp_fieldname])); $workflow_condition = new VTJsonCondition(); if ($workflow_condition->checkCondition($tmpEntityCache, $sub_condition) === true) { $sub_condition_res = true; break; } } } } $string .= ($sub_condition_res) ? 'true' : 'false'; } else { //crmv@121616e $tmpEntityCache = new PMCycleWorkflowEntity($current_user, array($sub_condition['fieldname']=>$replacement)); $workflow_condition = new VTJsonCondition(); $string .= ($workflow_condition->checkCondition($tmpEntityCache, $sub_condition) === true) ? 'true' : 'false'; } //crmv@121616 } else { //crmv@134058 if (in_array($sub_condition['operation'],array('has exactly','has more than','has less than')) && stripos($sub_condition['fieldname'],'ml') !== false) { if (!is_array($data[$sub_condition['fieldname']])) { list($wsModId,$recordId) = explode('x',$id); $module = getSalesEntityType($recordId); static $tableFieldValues = array(); if (!isset($tableFieldValues[$sub_condition['fieldname']][$recordId])) { require_once('include/utils/ModLightUtils.php'); $MLUtils = ModLightUtils::getInstance(); $columns = $MLUtils->getColumns($module,$sub_condition['fieldname']); $tableFieldValues[$sub_condition['fieldname']][$recordId] = array(); $values = $MLUtils->getValues($module,$recordId,$sub_condition['fieldname'],$columns); if (!empty($values)) { foreach($values as $tmp) { array_push($tableFieldValues[$sub_condition['fieldname']][$recordId],$tmp['row']); } } } $entityCache::$cache[$id]->data[$sub_condition['fieldname']] = $tableFieldValues[$sub_condition['fieldname']][$recordId]; //crmv@OPER10174 } else { if (isset($data[$sub_condition['fieldname']]['rows'])) $entityCache::$cache[$id]->data[$sub_condition['fieldname']] = $data[$sub_condition['fieldname']]['rows']; //crmv@OPER10174 else $entityCache::$cache[$id]->data[$sub_condition['fieldname']] = $data[$sub_condition['fieldname']]; //crmv@OPER10174 } } //crmv@134058e require_once('modules/com_workflow/VTWorkflowManager.inc');//crmv@207901 $workflow = new Workflow(); $workflow->test = Zend_Json::encode(array($sub_condition)); $string .= ($workflow->evaluate($entityCache, $id) === true) ? 'true' : 'false'; } if ($j < count($condition['conditions'])-1) $string .= ($sub_condition['glue'] == 'and') ? '&&' : '||'; $j++; } $string .= ')'; if ($i < count($conditions)-1) $string .= ($condition['glue'] == 'and') ? '&&' : '||'; $i++; } $string .= ";"; $this->debug('Conditions', $string); // crmv@189728 if ($string != "\$result = ();") eval($string); return $result; } //crmv@106857e function getStartingEvents($record, $module='', $processmakerid='', $executionCondition='', $eventName='vte.entity.aftersave.processes', $module_with = '') { //crmv@111639 crmv@200009 global $adb, $table_prefix; $col = 'start'; $adb->format_columns($col); $query = "select {$table_prefix}_processmaker_metarec.id, {$table_prefix}_processmaker_metarec.processid, {$table_prefix}_processmaker_metarec.elementid from {$table_prefix}_processmaker_metarec inner join {$table_prefix}_processmaker ON {$table_prefix}_processmaker_metarec.processid = {$table_prefix}_processmaker.id where $col = ? and active = ?"; $params = array(1,1); if (!empty($module)) { $query .= " and module = ?"; $params[] = $module; } if (!empty($processmakerid)) { $query .= " and {$table_prefix}_processmaker.id = ?"; $params[] = $processmakerid; } // crmv@200009 if (!empty($module_with)) { $query .= " and {$table_prefix}_processmaker.vte_metadata LIKE ? and {$table_prefix}_processmaker.vte_metadata LIKE ?"; $params[] = '%"' . $module . '"%'; $params[] = '%"' . $module_with . '"%'; } // crmv@200009e $result = $adb->pquery($query,$params); $return = array(); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { // check if the process is already started for this record if ($record !== false && $eventName != 'vte.entity.relate') { // crmv@200009 crmv@207852 $check = $this->getRunningProcess($record,$row['id'],$row['processid']); if ($check !== false) { // code removed crmv@93990 continue; } } //crmv@111639 $metadata = $this->getMetadata($row['processid'],$row['elementid']); if (empty($executionCondition) || $executionCondition == $metadata['execution_condition']) { $return[] = array( 'start'=>true, 'running_process'=>false, 'processid'=>$row['processid'], 'elementid'=>$row['elementid'], 'metaid'=>$row['id'], 'metadata'=>$metadata, ); } //crmv@111639e } } return $return; } function getNextEvents($record, $module, $parallel_current_info='', $executionCondition='') { global $adb, $table_prefix; $col = 'current'; $adb->format_columns($col); $result = $adb->pquery("select {$table_prefix}_running_processes.id as running_process, {$table_prefix}_running_processes.processmakerid, {$table_prefix}_running_processes.$col, {$table_prefix}_processmaker_rec.id from {$table_prefix}_running_processes inner join {$table_prefix}_processmaker ON {$table_prefix}_running_processes.processmakerid = {$table_prefix}_processmaker.id inner join {$table_prefix}_processmaker_rec on {$table_prefix}_running_processes.id = {$table_prefix}_processmaker_rec.running_process inner join {$table_prefix}_processmaker_metarec on {$table_prefix}_processmaker_rec.id = {$table_prefix}_processmaker_metarec.id and {$table_prefix}_running_processes.processmakerid = {$table_prefix}_processmaker_metarec.processid where {$table_prefix}_processmaker.active = ? and {$table_prefix}_running_processes.active = ? and crmid = ?", array(1,1,$record) ); $return = array(); if ($result && $adb->num_rows($result) > 0) { //crmv@155499 if ($module == 'Calendar') { $activitytype = getActivityType($record); ($activitytype == 'Task') ? $module = 'Calendar' : $module = 'Events'; } //crmv@155499e while($row=$adb->fetchByAssoc($result)) { //crmv@159135 $metaid = $row['id']; $structure = $this->getStructure($row['processmakerid'],$row['running_process']); $current_list = explode('|##|',$row['current']); foreach($current_list as $current) { if ($this->getEngineType($structure['shapes'][$current]) == 'Condition') { // exclude conditions of other modules $metadata = $this->getMetadata($row['processmakerid'],$current,$row['running_process']); if (strpos($metadata['moduleName'],':') !== false) { list($metaid,$moduleName) = explode(':',$metadata['moduleName']); } else { $moduleName = $metadata['moduleName']; } if ($module == $moduleName && $row['id'] == $metaid) { if (empty($executionCondition) || $executionCondition == $metadata['execution_condition']) { if (empty($parallel_current_info) || ($parallel_current_info['running_process'] == $row['running_process'] && $parallel_current_info['elementid'] == $current)) { $return[] = array( 'running_process'=>$row['running_process'], 'processid'=>$row['processmakerid'], 'elementid'=>$current, 'metaid'=>$metaid, 'metadata'=>$metadata ); } } } // code removed } } //crmv@159135e } } //crmv@105312 $processes_ids = array(); if ($module == 'Processes') { $processes_ids[] = $record; } else { //crmv@185647 $result = $adb->pquery("SELECT processesid FROM {$table_prefix}_processes p INNER JOIN {$table_prefix}_processmaker pm ON p.processmaker = pm.id INNER JOIN {$table_prefix}_processmaker_rec r ON r.running_process = p.running_process WHERE pm.active = ? and p.deleted = ? AND r.crmid = ?", array(1,0,$record)); //crmv@185647e if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $processes_ids[] = $row['processesid']; } } } if (!empty($processes_ids)) { require_once('modules/Settings/ProcessMaker/ProcessDynaForm.php'); $processDynaFormObj = ProcessDynaForm::getInstance(); foreach($processes_ids as $processes_id) { $result = $adb->pquery("select {$table_prefix}_processes.processmaker, {$table_prefix}_running_processes.$col, {$table_prefix}_processes.running_process from {$table_prefix}_processes inner join {$table_prefix}_running_processes on {$table_prefix}_running_processes.id = {$table_prefix}_processes.running_process inner join {$table_prefix}_processmaker ON {$table_prefix}_running_processes.processmakerid = {$table_prefix}_processmaker.id where processesid = ? and {$table_prefix}_processmaker.active = ? and {$table_prefix}_running_processes.active = ?", array($processes_id,1,1) ); if ($result && $adb->num_rows($result) > 0) { $processmaker = $adb->query_result($result,0,'processmaker'); $running_process = $adb->query_result($result,0,'running_process'); $structure = $this->getStructure($processmaker,$running_process); $current_list = explode('|##|',$adb->query_result($result,0,'current')); foreach($current_list as $current) { if ($this->getEngineType($structure['shapes'][$current]) == 'Condition') { $metadata = $this->getMetadata($processmaker,$current,$running_process); list($metaid,$mod) = explode(':',$metadata['moduleName']); if ($mod == 'DynaForm') { $dynaformvalues = $processDynaFormObj->getValues($running_process, $metaid); if (empty($executionCondition) || $executionCondition == $metadata['execution_condition']) { if (empty($parallel_current_info) || ($parallel_current_info['running_process'] == $running_process && $parallel_current_info['elementid'] == $current)) { $return[] = array( 'running_process'=>$running_process, 'processid'=>$processmaker, 'elementid'=>$current, 'metaid'=>false, 'metadata'=>$metadata, 'dynaformmetaid'=>$metaid, 'dynaformvalues'=>$dynaformvalues ); } } } } // code removed } } } } //crmv@105312e return $return; } function getOtherEvents($record, $module, $parallel_current_info='') { global $adb, $table_prefix; $return = array(); $running_processes = array(); $result = $adb->pquery("SELECT running_process FROM {$table_prefix}_processmaker_rec INNER JOIN {$table_prefix}_running_processes ON {$table_prefix}_running_processes.id = {$table_prefix}_processmaker_rec.running_process INNER JOIN {$table_prefix}_processmaker ON {$table_prefix}_running_processes.processmakerid = {$table_prefix}_processmaker.id WHERE crmid = ? AND {$table_prefix}_processmaker.active = ? AND {$table_prefix}_running_processes.active = ?", array($record,1,1)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $running_processes[] = $row['running_process']; } } if ($module == 'Processes') { $result = $adb->pquery("SELECT {$table_prefix}_processes.running_process FROM {$table_prefix}_processes inner join {$table_prefix}_running_processes on {$table_prefix}_running_processes.id = {$table_prefix}_processes.running_process inner join {$table_prefix}_processmaker ON {$table_prefix}_running_processes.processmakerid = {$table_prefix}_processmaker.id WHERE processesid = ? and {$table_prefix}_processmaker.active = ? and {$table_prefix}_running_processes.active = ?", array($record,1,1)); if ($result && $adb->num_rows($result) > 0) { $running_processes[] = $adb->query_result($result,0,'running_process'); } } //crmv@169519 $result1 = $adb->pquery("SELECT {$table_prefix}_processmaker_rec.crmid, setype FROM {$table_prefix}_processmaker_rec INNER JOIN {$table_prefix}_crmentity ON {$table_prefix}_processmaker_rec.crmid = {$table_prefix}_crmentity.crmid WHERE running_process in (".generateQuestionMarks($running_processes).") AND {$table_prefix}_processmaker_rec.crmid <> ?", array($running_processes,$record)); if ($result1 && $adb->num_rows($result1) > 0) { while($row1=$adb->fetchByAssoc($result1)) { //crmv@111639 $nextEvents = $this->getNextEvents($row1['crmid'], $row1['setype'], $parallel_current_info, 'EVERY_TIME'); $startingEvents = $this->getStartingEvents($row1['crmid'], $row1['setype'], '', 'EVERY_TIME'); $events = array_merge($nextEvents,$startingEvents); //crmv@111639e if (!empty($events)) { foreach($events as &$event) { if (!empty($event['metaid']) && !empty($event['running_process'])) { $crmid = ProcessMakerEngine::getCrmid($event['metaid'],$event['running_process']); } elseif (!empty($event['dynaformmetaid'])) { require_once('modules/Settings/ProcessMaker/ProcessDynaForm.php'); $processDynaFormObj = ProcessDynaForm::getInstance(); $crmid = $processDynaFormObj->getProcessesId($event['running_process'],$event['dynaformmetaid']); } if (!empty($crmid)) { $moduleName = getSalesEntityType($crmid); $webserviceObject = VtenextWebserviceObject::fromName($adb,$moduleName);//crmv@207871 $id = vtws_getId($webserviceObject->getEntityId(),$crmid); $event['entity'] = array('id'=>$id,'entity_id'=>$crmid,'moduleName'=>$moduleName); } } } $return = array_merge($return,$events); } } //crmv@169519e return $return; } function cleanDuplicateEvents(&$events) { $new_events = array(); if (!empty($events)) { foreach($events as $e) { $check = $this->checkDuplicateEvent($new_events,$e); if (!$check) $new_events[] = $e; } } $events = $new_events; } function checkDuplicateEvent($events,$event) { if (!empty($events)) { foreach($events as $e) { if ( $e['running_process'] == $event['running_process'] && $e['processid'] == $event['processid'] && $e['elementid'] == $event['elementid'] && $e['metaid'] == $event['metaid'] && $e['dynaformmetaid'] == $event['dynaformmetaid'] ) return true; } } return false; } function getCurrentElementId($running_process,$processid='',$elementid='') { global $adb, $table_prefix; $current = false; $result = $adb->pquery("select current from {$table_prefix}_running_processes where id = ?", array($running_process)); if ($result && $adb->num_rows($result) > 0) { $current = $adb->query_result($result,0,'current'); } // if parallels ways search current using the $element if (stripos($current,'|##|') !== false) { $currents = explode('|##|',$current); if (in_array($elementid,$currents)) { $current = $elementid; } else { //TODO forse questo else non serve piu' $PMUtils = ProcessMakerUtils::getInstance(); $incomings = $PMUtils->getIncoming($processid,$elementid,$running_process); if (!empty($incomings)) { foreach($incomings as $incoming) { if (in_array($incoming['shape']['id'],$currents)) { $current = $incoming['shape']['id']; break; } } } } if (stripos($current,'|##|') !== false) { $current = false; } } return $current; } function getRunningProcess($crmid,$metaid,$processid) { // il check lo faccio sui processi in corso non su quelli salvati $running_process = false; $processes = ProcessMakerHandler::$running_processes; if (!empty($processes)) { foreach($processes as $p) { if ($p['new'] && $crmid == $p['record'] && $metaid == $p['metaid'] && $processid == $p['processid']) { $running_process = $p['running_process']; break; } } } /* global $adb, $table_prefix; $running_process = false; $result = $adb->pquery( "select running_process from {$table_prefix}_processmaker_rec inner join {$table_prefix}_running_processes on {$table_prefix}_processmaker_rec.running_process = {$table_prefix}_running_processes.id where {$table_prefix}_processmaker_rec.crmid = ? and {$table_prefix}_processmaker_rec.id = ? and {$table_prefix}_running_processes.processmakerid = ? order by running_process desc", //crmv@93990 //and {$table_prefix}_running_processes.end = 0 array($crmid,$metaid,$processid) ); if ($result && $adb->num_rows($result) > 0) { $running_process = $adb->query_result($result,0,'running_process'); }*/ return $running_process; } //crmv@105312 function checkTimerExists($mode,$running_process,$prev_elementid,$elementid,&$occurrence) { global $adb, $table_prefix; // check occurrence $occurrence = 0; $result = $adb->pquery("select id from {$table_prefix}_running_processes_logs where running_process = ? and elementid = ?", array($running_process,$prev_elementid)); if ($result && $adb->num_rows($result) > 0) $occurrence = $adb->num_rows($result)-1; $result = $adb->pquery("select id from {$table_prefix}_running_processes_timer where mode = ? and running_process = ? and prev_elementid = ? and elementid = ? and occurrence = ?", array($mode,$running_process,$prev_elementid,$elementid,$occurrence)); return ($result && $adb->num_rows($result) > 0); } function createTimer($mode,$timer,$running_process,$prev_elementid,$elementid,$occurrence=0,$info=array()) { //crmv@127048 global $adb, $table_prefix; (empty($info)) ? $info = null : $info = Zend_Json::encode($info); $adb->pquery("insert into {$table_prefix}_running_processes_timer(id,mode,timer,running_process,prev_elementid,elementid,occurrence,info) values(?,?,?,?,?,?,?,?)", array($adb->getUniqueID("{$table_prefix}_running_processes_timer"),$mode,$timer,$running_process,$prev_elementid,$elementid,$occurrence,$info) ); } //crmv@105312e //crmv@134058 function deleteTimer($mode,$running_process,$prev_elementid='',$elementid='') { global $adb, $table_prefix; $query = "delete from {$table_prefix}_running_processes_timer where mode = ?"; $params = array($mode); if (is_array($running_process)) { $query .= " and running_process in (".generateQuestionMarks($running_process).")"; $params[] = $running_process; } else { $query .= " and running_process = ?"; $params[] = $running_process; } if (!empty($prev_elementid)) { $query .= " and prev_elementid = ?"; $params[] = $prev_elementid; } if (!empty($elementid)) { $query .= " and elementid = ?"; $params[] = $elementid; } $adb->pquery($query,$params); } //crmv@134058e function includeCronDependencies() { require_once 'modules/Settings/ProcessMaker/thirdparty/cron-expression/src/Cron/FieldInterface.php'; require_once 'modules/Settings/ProcessMaker/thirdparty/cron-expression/src/Cron/AbstractField.php'; require_once 'modules/Settings/ProcessMaker/thirdparty/cron-expression/src/Cron/CronExpression.php'; require_once 'modules/Settings/ProcessMaker/thirdparty/cron-expression/src/Cron/DayOfMonthField.php'; require_once 'modules/Settings/ProcessMaker/thirdparty/cron-expression/src/Cron/DayOfWeekField.php'; require_once 'modules/Settings/ProcessMaker/thirdparty/cron-expression/src/Cron/FieldFactory.php'; require_once 'modules/Settings/ProcessMaker/thirdparty/cron-expression/src/Cron/HoursField.php'; require_once 'modules/Settings/ProcessMaker/thirdparty/cron-expression/src/Cron/MinutesField.php'; require_once 'modules/Settings/ProcessMaker/thirdparty/cron-expression/src/Cron/MonthField.php'; require_once 'modules/Settings/ProcessMaker/thirdparty/cron-expression/src/Cron/YearField.php'; } function previewTimerStart($vte_metadata) { $return = array(); $date_start = getValidDBInsertDateValue($vte_metadata['date_start']).' '.$vte_metadata['starthr'].':'.$vte_metadata['startmin']; ($vte_metadata['date_end_mass_edit_check'] == 'on') ? $date_end = getValidDBInsertDateValue($vte_metadata['date_end']).' '.$vte_metadata['endhr'].':'.$vte_metadata['endmin'] : $date_end = false; $return = $this->getTimerRecurrences($date_start,$date_end,($vte_metadata['recurrence'] == 'on'),$vte_metadata['cron_value'],5); if (!empty($return)) { foreach($return as &$date) { $date = getDisplayDate($date); } } return $return; } function getTimerRecurrences($date_start,$date_end=false,$recurrence=false,$cron_string='',$iterations=1) { $return = array(); $i=0; if (!$recurrence) { $return[] = $date_start; } elseif(!empty($cron_string)) { $this->includeCronDependencies(); $cron = Cron\CronExpression::factory($cron_string); $runDates = $cron->getMultipleRunDates($iterations*2, $date_start, false, true); if (!empty($runDates)) { foreach($runDates as $runDate) { $runDate = $runDate->format('Y-m-d H:i:s'); if ($date_end === false || strtotime($runDate) <= strtotime($date_end)) { $return[] = $runDate; $i++; if ($iterations == $i) break; } } } } return $return; } function isTimerProcess($id,&$shapeid) { $structure = $this->getStructure($id); foreach($structure['shapes'] as $shapeid => $shape) { if ($shape['type'] == 'StartEvent') { return ($shape['subType'] == 'TimerEventDefinition'); } } return false; } function isChangedTimerCondition($vte_metadata_new,$vte_metadata) { if (empty($vte_metadata_new) && empty($vte_metadata)) return false; else { foreach($vte_metadata_new as $k => $v) { if ($v != $vte_metadata[$k]) return true; } } return false; } function getElementTitle($structure) { $text = $structure['text']; $subType = $this->formatType($structure['subType']); $cancelActivity = $structure['cancelActivity']; $title = $this->formatType($structure['type'],true); if (!empty($subType)) { $title .= "($subType"; if (isset($cancelActivity)) ($cancelActivity) ? $title .= ': Interrupting' : $title .= ': Non-Interrupting'; $title .= ")"; } if (!empty($text)) $title .= ': '.trim($text); return $title; } //crmv@100495 function showRunProcessesButton($module, $record='') { return false; } //crmv@100495e //crmv@100591 function getElementsActors($processid,$email_fields=false) { $actors = array(); if ($email_fields) { global $adb, $table_prefix; $fieldnames = array(); $result = $adb->pquery("SELECT fieldname, fieldlabel FROM {$table_prefix}_field LEFT JOIN {$table_prefix}_ws_fieldtype ON {$table_prefix}_field.uitype = {$table_prefix}_ws_fieldtype.uitype WHERE tabid = ? AND ({$table_prefix}_field.uitype = ? OR fieldtype = ?)", array(29,104,'email')); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByASsoc($result)) { $fieldnames[$row['fieldname']] = $row['fieldlabel']; } } } $structure = $this->getStructure($processid); if (!empty($structure['shapes'])) { foreach($structure['shapes'] as $elementid => $structure) { if ($this->getEngineType($structure) == 'Condition') { if ($email_fields) { foreach($fieldnames as $fieldname => $fieldlabel) { $actors['$ACTOR-'.$elementid.'-'.$fieldname] = $this->getElementTitle($structure).' - '.getTranslatedString($fieldlabel,'Users'); } } else { $actors['$ACTOR-'.$elementid] = $this->getElementTitle($structure); } } } } return $actors; } function getActor($running_process, $elementid, $fieldname='') { global $adb, $table_prefix; $result = $adb->limitpQuery("SELECT userid FROM {$table_prefix}_running_processes_logs WHERE running_process = ? AND prev_elementid = ? ORDER BY logtime DESC", 0, 1, array($running_process, $elementid)); if ($result && $adb->num_rows($result) > 0) { if (!empty($fieldname)) { $user = CRMEntity::getInstance('Users'); $user->retrieveCurrentUserInfoFromFile($adb->query_result($result,0,'userid')); return $user->column_fields[$fieldname]; } else { return $adb->query_result($result,0,'userid'); } } return false; } function getProcessActors($running_process) { global $adb, $table_prefix; $actors = array(); $result = $adb->pquery("SELECT DISTINCT userid FROM {$table_prefix}_running_processes_logs WHERE running_process = ?", array($running_process)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $actors[] = $row['userid']; } } return $actors; } //crmv@100591e //crmv@103450 function getElementsExecutedByActors($processid, $running_process) { global $adb, $table_prefix; $structure = $this->getStructure($processid,$running_process); $return = array(); $result = $adb->pquery("SELECT userid, prev_elementid FROM {$table_prefix}_running_processes_logs WHERE running_process = ? ORDER BY id", array($running_process)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { if (empty($return[$row['userid']]) || !in_array($row['prev_elementid'],$return[$row['userid']])) { if ($structure['shapes'][$row['prev_elementid']]['type'] == 'Task') $return[$row['userid']][] = $row['prev_elementid']; } } } return $return; } //crmv@103450e // crmv@146671 public function getExtWSMeta($processid, $running_process) { global $adb, $table_prefix; (!empty($running_process)) ? $xml_version = $this->getSystemVersion4RunningProcess($running_process,array('processmaker','xml_version')) : $xml_version = ''; if (!empty($xml_version)) { $query = "SELECT * FROM {$table_prefix}_process_extws_meta_vh WHERE versionid = ? and processid = ?"; $params = array($xml_version, $processid); } else { $query = "SELECT * FROM {$table_prefix}_process_extws_meta WHERE processid = ?"; $params = array($processid); } $metas = array(); $result = $adb->pquery($query, $params); if ($result && $adb->num_rows($result) > 0) { while ($row = $adb->fetchByAssoc($result, -1, false)) { $metas[$row['elementid']] = $row; } } return $metas; } public function getExtWSMetaById($metaid, $running_process) { global $adb, $table_prefix; (!empty($running_process)) ? $xml_version = $this->getSystemVersion4RunningProcess($running_process,array('processmaker','xml_version')) : $xml_version = ''; if (!empty($xml_version)) { $query = "SELECT * FROM {$table_prefix}_process_extws_meta_vh WHERE versionid = ? and id = ?"; $params = array($xml_version, $metaid); } else { $query = "SELECT * FROM {$table_prefix}_process_extws_meta WHERE id = ?"; $params = array($metaid); } $meta = array(); $result = $adb->pquery($query, $params); if ($result && $adb->num_rows($result) > 0) { $meta = $adb->fetchByAssoc($result, -1, false); } return $meta; } // get the fields returned by all the webservice calls in the process public function getExtWSFields($processid, $skipElement=null, $running_process='') { // crmv@147433 require_once('modules/Settings/ExtWSConfig/ExtWSUtils.php'); $EWSU = new ExtWSUtils(); $wsfields = array(); $meta = $this->getMetadata($processid, '', $running_process); $wsmeta = $this->getExtWSMeta($processid, $running_process); if (!empty($meta)) { foreach ($meta as $taskinfo) { if (is_array($taskinfo['actions'])) { foreach ($taskinfo['actions'] as $action) { if ($action['action_type'] == 'CallExtWS') { $elementid = $action['elementid']; if ($skipElement && $skipElement == $elementid) continue; // crmv@147433 $metaid = $wsmeta[$elementid]['id']; $extwsid = intval($action['extwsid']); $wsinfo = $EWSU->getWSInfo($extwsid); // now prepare the available fields $fields = array( array( 'value' => '$WS'.$metaid.'-extws_success', 'label' => getTranslatedString('LBL_EXTWS_RESULTFIELD_OUTCOME', 'Settings').'?', 'expression' => 'extws_success', ), array( 'value' => '$WS'.$metaid.'-extws_returncode', 'label' => getTranslatedString('LBL_EXTWS_RESULTFIELD_CODE', 'Settings'), 'expression' => 'extws_returncode', ), array( 'value' => '$WS'.$metaid.'-extws_returnmessage', 'label' => getTranslatedString('LBL_EXTWS_RESULTFIELD_MESSAGE', 'Settings'), 'expression' => 'extws_returnmessage', ), ); if (is_array($wsinfo['results'])) { foreach ($wsinfo['results'] as $rinfo) { $fields[] = array( 'value' => '$WS'.$metaid.'-'.$rinfo['name'], 'label' => $rinfo['name'], 'expression' => $rinfo['value'], ); } } if (is_array($action['extra_results'])) { foreach ($action['extra_results'] as $rname => $rval) { $fields[] = array( 'value' => '$WS'.$metaid.'-'.$rname, 'label' => $rname, 'expression' => $rval, ); } } // and add it to the final array $wsfields[] = array( 'metaid' => $metaid, 'label' => "[\$WS$metaid] Web service (BPMN-ScriptTask: {$action['action_title']})", 'fields' => $fields, ); } } } } } return $wsfields; } /** * Get the full response of a WS call */ public function getExtWSResult($running_process, $metaid) { global $adb, $table_prefix; $results = array(); $query = "SELECT results FROM {$table_prefix}_process_extws WHERE running_process = ? AND metaid = ?"; $params = array($running_process, $metaid); $result = $adb->pquery($query, $params); if ($result && $adb->num_rows($result) > 0) { $results = $adb->query_result_no_html($result, 0, 'results'); $results = Zend_Json::decode($results); } return $results; } /** * Get only the extracted data of the WS call */ public function getExtWSResultValues($running_process, $metaid, $actionid, $engine) { require_once('modules/Settings/ExtWSConfig/ExtWSExtractor.php'); // get the meta (to have the processid and the extwsid) $wsmeta = $this->getExtWSMetaById($metaid, $running_process); $extwsid = intval($wsmeta['extwsid']); // get the process metadata $meta = $this->getMetadata($wsmeta['processid'], $wsmeta['elementid'], $running_process); // crmv@199886: removed crmv@OPER10174 $actionmeta = null; if (is_array($meta['actions'])) { foreach ($meta['actions'] as $action) { if ($action['action_title'] == $wsmeta['text']) { $actionmeta = $action; break; } } } if (!$actionmeta) return array(); // get all the response $results = $this->getExtWSResult($running_process, $metaid); $fields = array(); $allfields = $this->getExtWSFields($wsmeta['processid'], null, $running_process); // get only the fields for my process foreach ($allfields as $group) { if ($group['metaid'] == $metaid) { foreach ($group['fields'] as $fld) { $expr = $fld['expression']; if ($engine) { $expr = $engine->replaceTags('extra_result', $expr, array(), array(), $actionid); } $fields[] = array( 'name' => preg_replace('/^\$WS[0-9]*-/', '', $fld['value']), 'value' => $expr, ); } break; } } $EWSE = new ExtWSExtractor(); try { $values = $EWSE->extractFields($results, $fields); } catch (Exception $e) { return array(); } return $values; } // crmv@146671e //crmv@100731 function getTranslatedProcessResource($processid,$value) { global $adb, $table_prefix; if (is_numeric($value)) { $ownerType = getOwnerType($value); if ($ownerType == 'Users') { global $showfullusername; $name = getUserName($value,$showfullusername); } else { $tmp = getGroupName($value); $name = $tmp[0]; } $value = $name; } else { if (strpos($value,':') == 3) { // old mode list($meta_processid,$metaid,$module,$fieldname) = explode(':',$value); $moduleInstance = Vtecrm_Module::getInstance($module); $result = $adb->pquery("select fieldlabel from {$table_prefix}_field where tabid = ? and fieldname = ?", array($moduleInstance->id,$fieldname)); $fieldlabel = getTranslatedString($adb->query_result($result,0,'fieldlabel'),$module); $structure = $this->getStructure($processid); $value = $fieldlabel.' '.getTranslatedString('LBL_OF','Settings').' '.$this->getRecordsInvolvedLabel($processid,$metaid); } else { if (stripos($value,'$ACTOR-') !== false) { $structure = $this->getStructure($processid); list($actor,$elementid) = explode('$ACTOR-',$value); $value = getTranslatedString('LBL_PM_PARTECIPANT_OF','Settings').' '.$this->getElementTitle($structure['shapes'][$elementid]); } elseif (stripos($value,'$sdk:') !== false) { $sdkFieldConditions = SDK::getProcessMakerFieldActions(); $tmp_sdk_function = str_replace('$sdk:','',$value); $funct = substr($tmp_sdk_function,0,strpos($tmp_sdk_function,'(')); if (isset($sdkFieldConditions[$funct])) { $value = getTranslatedString('LBL_PM_SDK_CUSTOM_FUNCTION','Settings').': '.$sdkFieldConditions[$funct]['label']; } } elseif (stripos($value,'$DF') !== false) { $tmp = str_replace('$DF','',$value); list($dynaform_metaid,$dynaform_fieldname) = explode('-',$tmp); if (strpos($dynaform_metaid,':') !== false) { list($processid,$dynaform_metaid) = explode(':',$dynaform_metaid); } require_once('modules/Settings/ProcessMaker/ProcessDynaForm.php'); $processDynaFormObj = ProcessDynaForm::getInstance(); $options = $processDynaFormObj->getOptions($processid); $dflabel = $options["$dynaform_metaid:DynaForm"][0]; $fieldOptions = $processDynaFormObj->getFieldsOptions($processid); $fieldlabel = $fieldOptions['all'][$dflabel][$value]; $value = $fieldlabel.' '.getTranslatedString('LBL_OF','Settings').' '.$dflabel; } else { $tmp = str_replace('$','',$value); list($metaid,$fieldname) = explode('-',$tmp); if (strpos($metaid,':') !== false) { list($processid,$metaid) = explode(':',$metaid); } $records = $this->getRecordsInvolved($processid); foreach($records as $r) { if ($r['seq'] == $metaid) { $moduleInstance = Vtecrm_Module::getInstance($r['module']); $result = $adb->pquery("select fieldlabel from {$table_prefix}_field where tabid = ? and fieldname = ?", array($moduleInstance->id,$fieldname)); if ($result && $adb->num_rows($result) > 0) { $fieldlabel = getTranslatedString($adb->query_result($result,0,'fieldlabel'),$module); $value = $fieldlabel.' '.getTranslatedString('LBL_OF','Settings').' '.$r['label']; } break; } } if (empty($fieldlabel)) $value = $fieldname.' '.getTranslatedString('LBL_OF','Settings').' '.$this->getRecordsInvolvedLabel($processid,$metaid); } } } return $value; } function getAdvancedPermissions($return_mode) { global $adb, $table_prefix, $current_user; static $ids = array(); if (empty($ids)) { $inserts = array(); require('user_privileges/requireUserPrivileges.php'); if (empty($current_user_groups)) { $userGroupFocus = new GetUserGroups(); $userGroupFocus->getAllUserGroups($current_user->id); $current_user_groups = $userGroupFocus->user_groups; } $smowners = array($current_user->id); if (!empty($current_user_groups)) $smowners = array_filter(array_merge($smowners, $current_user_groups)); $result = $adb->pquery("SELECT crmid, read_perm, write_perm FROM {$table_prefix}_process_adv_permissions WHERE ".$adb->format_column('resource')." in (".generateQuestionMarks($smowners).")", array($smowners)); // crmv@165801 $tmp = array(); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $tmp[$row['crmid']][] = array('read_perm'=>$row['read_perm'],'write_perm'=>$row['write_perm']); } foreach($tmp as $id => $permissions) { foreach($permissions as $permission) { // if there are more conditions verified (ex. I'm part of groups) select the most restrictive if (!isset($ids[$id]) || $permission['read_perm'] < $ids[$id]['read_perm'] || $permission['write_perm'] < $ids[$id]['write_perm']) { if (!isset($ids[$id])) $inserts[] = array($current_user->id, $id); // crmv@133311 $ids[$id] = $permission; } } } } if ($return_mode == 'sql' && !empty($inserts)) { $adb->pquery("delete from {$table_prefix}_process_adv_perm_tmp where userid = ?", array($current_user->id)); $adb->bulkInsert("{$table_prefix}_process_adv_perm_tmp", null, $inserts); } } if ($return_mode == 'sql') { (empty($ids)) ? $sql = '' : $sql = " OR {$table_prefix}_crmentity.crmid IN (select crmid from {$table_prefix}_process_adv_perm_tmp where userid = ".$current_user->id.")"; return $sql; } elseif ($return_mode == 'array') { return $ids; } } function checkAdvancedPermissions($module,$actionname,$record_id) { $return = ''; $actionid = getActionid($actionname); $permissions = $this->getAdvancedPermissions('array'); if (isset($permissions[$record_id])) { if ($actionid === 4) { // detailview ($permissions[$record_id]['read_perm'] == 1) ? $return = 'yes' : $return = 'no'; } elseif ($actionid === 0 || $actionid === 1) { // save, edit ($permissions[$record_id]['write_perm'] == 1) ? $return = 'yes' : $return = 'no'; } } return $return; } function getAdvancedPermissionsResources($record) { global $adb, $table_prefix; //crmv@169362 static $resources = array(); if (!isset($resources[$record])) { //crmv@169362e $resources[$record] = array(); $result = $adb->pquery("SELECT * FROM {$table_prefix}_process_adv_permissions WHERE crmid = ?", array($record)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { if ($row['read_perm'] == 1 && $row['write_perm'] == 1) { $visibility = getTranslatedString('Read/Write','Settings'); } elseif ($row['read_perm'] == 1) { $visibility = getTranslatedString('Read Only ','Settings'); } //crmv@180505 if ($row['resource_type'] == 'O') { $checkGroup = $adb->pquery("select groupid from {$table_prefix}_groups where groupid = ?", array($row['resource'])); if ($checkGroup && $adb->num_rows($checkGroup) > 0) $row['resource_type'] = 'T'; } //crmv@180505e if ($row['resource_type'] == 'T') { $group = getGroupName($row['resource']); $img = getGroupAvatar(); $name = ' '; $fullname = $group[0]; } else { $img = getUserAvatar($row['resource']); $name = getUserName($row['resource'],false); $fullname = getUserFullName($row['resource']); } $resources[$record][] = array( 'id'=>$row['resource'], 'img'=>$img, 'name'=>$name, 'fullname'=>$fullname, 'read_perm'=>$row['read_perm'], 'write_perm'=>$row['write_perm'], 'alt'=>getTranslatedString('LBL_PM_ADVANCED_PERMISSIONS_VISIBILITY','Settings').': '.$visibility, ); } } //crmv@169362 } return $resources[$record]; //crmv@169362e } //crmv@100731e //crmv@93990 function getProcessRelatedTo($record, $field) { global $adb, $table_prefix, $current_user; static $relatedTo = array(); if (!isset($relatedTo[$record])) { $relatedTo[$record]['processesid'] = false; require('user_privileges/requireUserPrivileges.php'); if (empty($current_user_groups)) { $userGroupFocus = new GetUserGroups(); $userGroupFocus->getAllUserGroups($current_user->id); $current_user_groups = $userGroupFocus->user_groups; } $smowners = array($current_user->id); if (!empty($current_user_groups)) $smowners = array_filter(array_merge($smowners, $current_user_groups)); // crmv@137082 crmv@180440 crmv@185647 $endcol = 'end'; $adb->format_columns($endcol); // crmv@195119 $result = $adb->pquery("SELECT processesid, processmaker, dynaform_meta.elementid AS current_dynaform, dynaform_meta.id AS dynaformmetaid FROM {$table_prefix}_processes INNER JOIN {$table_prefix}_running_processes ON {$table_prefix}_running_processes.id = {$table_prefix}_processes.running_process INNER JOIN {$table_prefix}_process_dynaform_meta dynaform_meta ON dynaform_meta.processid = {$table_prefix}_processes.processmaker INNER JOIN {$table_prefix}_process_dynaform dynaform ON dynaform.running_process = {$table_prefix}_processes.running_process AND dynaform.metaid = dynaform_meta.id WHERE deleted = 0 AND $endcol = 0 AND related_to = ? AND smownerid in (".generateQuestionMarks($smowners).") AND dynaform.done = 0 ORDER BY createdtime ASC", array($record, $smowners)); // crmv@137082e crmv@180440e if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result,-1,false)) { $data = $this->retrieve($row['processmaker']); $helper = Zend_Json::decode($data['helper']); $helper = $helper[$row['current_dynaform']]; if ($helper['related_to_popup'] == 'on') { $relatedTo[$record] = array( 'processesid'=>$row['processesid'], 'dynaformmetaid'=>$row['dynaformmetaid'], 'current_dynaform'=>$row['current_dynaform'], 'related_to_popup'=>$helper['related_to_popup'], 'related_to_popup_opt'=>$helper['related_to_popup_opt'], ); break; } } } // crmv@195119e } return $relatedTo[$record][$field]; } //crmv@93990e //crmv@103450 function getProcessHelperDefault($processid,$elementid,$type) { if ($this->isEndTask($type)) return 'Ended'; else { $structure = $this->getStructureElementInfo($processid,$elementid,'tree'); $attachers = $structure['attachers']; if (!empty($attachers)) { foreach($attachers as $attacher) { $attacher_structure = $this->getStructureElementInfo($processid,$attacher,'shapes'); if ($attacher_structure['subType'] == 'TimerEventDefinition') { return 'Waiting'; } } } } return 'Running'; } //crmv@103450e //crmv@106856 function addConditionTranslations(&$rules, $processmakerid) { if (!empty($rules)) { foreach($rules as &$a) { $conditions = $a['conditions']; list($entityId,$module) = explode(':',$a['meta_record']); if ($module == 'DynaForm') { require_once('modules/Settings/ProcessMaker/ProcessDynaForm.php'); $processDynaFormObj = ProcessDynaForm::getInstance(); $label = $processDynaFormObj->getLabel($processmakerid,$entityId).' '; } else { $label = $this->getRecordsInvolvedLabel($processmakerid,$entityId).' '; } $i=0; foreach($conditions as $condition) { $sub_conditions = $condition['conditions']; if (count($sub_conditions) > 1) $label .= '('; foreach($sub_conditions as $ii => $sub_condition) { $label .= $this->translateConditionFieldname($sub_condition['fieldname'],$module,$processmakerid,$entityId).' '.$this->translateConditionOperation($sub_condition['operation']).' '.$this->translateConditionValue($sub_condition['fieldname'],$module,$sub_condition['value']).''; if ($ii < count($sub_conditions)) $label .= ' '.$this->translateConditionGlue($sub_condition['glue']).' '; } $i++; if (count($sub_conditions) > 1) $label .= ')'; if ($i < count($conditions)) $label .= ' '.$this->translateConditionGlue($condition['glue']).' '; } $a['conditions_translate'] = $label; } } } function getAdvancedFieldAssignment($fieldname) { return VteSession::getArray(array('AdvancedFieldAssignment',$fieldname)); } function setAdvancedFieldAssignment($fieldname, $rules) { VteSession::setArray(array('AdvancedFieldAssignment',$fieldname),$rules); } function unsetAdvancedFieldAssignment($fieldname='') { if (empty($fieldname)) VteSession::removeArray(array('AdvancedFieldAssignment')); else VteSession::removeArray(array('AdvancedFieldAssignment',$fieldname)); } //crmv@160843 codes removed function saveAdvancedFieldAssignment($fieldname,$action,$info) { $rules = $this->getAdvancedFieldAssignment($fieldname); if ($action == 'condition') { $ruleid = $info[0]; $meta_record = $info[1]; $conditions = Zend_Json::decode($info[2]); if ($ruleid === '') { $rules[] = array( 'meta_record' => $meta_record, 'conditions' => $conditions, ); } else { $rules[$ruleid]['meta_record'] = $meta_record; $rules[$ruleid]['conditions'] = $conditions; } } elseif ($action == 'values') { $form = Zend_Json::decode($info[0]); $count = $form['conditions_count']; if (!empty($count)) { for($i=0;$i<$count;$i++) { //crmv@160843 if (isset($form['assigntype'.$i]) || isset($form['assigned_user_id'.$i.'_type'])) { (isset($form['assigntype'.$i])) ? $assigntype = $form['assigntype'.$i] : $assigntype = $form['assigned_user_id'.$i.'_type']; if ($assigntype == 'U' || $assigntype == 'v') $value = $form['assigned_user_id'.$i]; elseif ($assigntype == 'T') $value = $form['assigned_group_id'.$i]; elseif (strtolower($assigntype) == 'o') $value = $form['other_assigned_user_id'.$i]; $rules[$i]['value'] = $value; $rules[$i]['assigntype'] = $assigntype; $rules[$i]['sdk_params'] = $form['sdk_params_assigned_user_id'.$i]; } else { $rules[$i]['value'] = $form[$fieldname.$i]; } //crmv@160843e } } /* } elseif ($action == 'db') { $id = $info[0]; $elementid = $info[1]; $actionid = $info[2]; $data = $this->retrieve($id); $vte_metadata = Zend_Json::decode($data['vte_metadata']); $vte_metadata[$elementid]['actions'][$actionid]['advanced_field_assignment'][$fieldname] = $rules; $this->saveMetadata($id,$elementid,Zend_Json::encode($vte_metadata[$elementid])); */ } $this->setAdvancedFieldAssignment($fieldname, $rules); } function removeAdvancedFieldAssignment($processmakerid,$elementid,$actionid,$fieldname,$ruleid) { /* $data = $this->retrieve($processmakerid); $vte_metadata = Zend_Json::decode($data['vte_metadata']); unset($vte_metadata[$elementid]['actions'][$actionid]['advanced_field_assignment'][$fieldname][$ruleid]); $vte_metadata[$elementid]['actions'][$actionid]['advanced_field_assignment'][$fieldname] = array_values($vte_metadata[$elementid]['actions'][$actionid]['advanced_field_assignment'][$fieldname]); $this->saveMetadata($processmakerid,$elementid,Zend_Json::encode($vte_metadata[$elementid])); $this->setAdvancedFieldAssignment($fieldname, $vte_metadata[$elementid]['actions'][$actionid]['advanced_field_assignment'][$fieldname]); */ $rules = $this->getAdvancedFieldAssignment($fieldname); unset($rules[$ruleid]); $this->setAdvancedFieldAssignment($fieldname, array_values($rules)); } //crmv@106856e //crmv@106857 function getAllTableFields($processmaker) { global $adb, $table_prefix; $tfields = array(); $records = $this->getRecordsInvolved($processmaker); if (!empty($records)) { foreach($records as $r) { $bfields = array(); $key = $r['seq'].':'.$r['module']; $moduleInstance = Vtecrm_Module::getInstance($r['module']); $result = $adb->pquery("select fieldname, fieldlabel from {$table_prefix}_field where tabid = ? and uitype = ?", array($moduleInstance->id,220)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $fkey = $r['seq'].':::'.$row['fieldname']; //crmv@182891 $bfields[$fkey] = $row['fieldlabel']; } } //crmv@182891 $tmp_values = array(); if (empty($referenceInfo[$r['module']])) { $relationManager = RelationManager::getInstance(); $relationsN1 = $relationManager->getRelations($r['module'], ModuleRelation::$TYPE_NTO1); if (!empty($relationsN1)) { $referenceInfo[$r['module']] = array(); foreach($relationsN1 as $rel) { if (!isset($referenceInfo[$r['module']][$rel->fieldid])) { $result = $adb->pquery("select fieldlabel from {$table_prefix}_field where fieldid = ?", array($rel->fieldid)); if ($result && $adb->num_rows($result) > 0) { $referenceInfo[$r['module']][$rel->fieldid] = array( 'fieldid'=>$rel->fieldid, 'fieldlabel'=>getTranslatedString($adb->query_result($result,0,'fieldlabel'),$rel->getFirstModule()), 'module'=>$rel->getSecondModule(), ); } } } } } if (!empty($referenceInfo[$r['module']])) { foreach($referenceInfo[$r['module']] as $rr) { //crmv@160368 crmv@160859 $relatedmodres = $adb->pquery("SELECT relmodule FROM ".$table_prefix."_fieldmodulerel WHERE fieldid=?", Array($rr['fieldid'])); if ($relatedmodres && $adb->num_rows($relatedmodres) > 1) { // check for multiple related modules while($row_relmod=$adb->fetchByAssoc($relatedmodres)) { $referenceKey = $r['seq'].':'.$rr['fieldid'].':'.$row_relmod['relmodule']; $moduleInstance1 = Vtecrm_Module::getInstance($row_relmod['relmodule']); $result1 = $adb->pquery("select fieldname, fieldlabel from {$table_prefix}_field where tabid = ? and uitype = ?", array($moduleInstance1->id,220)); if ($result1 && $adb->num_rows($result1) > 0) { while($row1=$adb->fetchByAssoc($result1)) { $bfields[$referenceKey.':'.$row1['fieldname']] = $rr['fieldlabel'].' ('.getTranslatedString($row_relmod['relmodule'],$row_relmod['relmodule']).') : '.$row1['fieldlabel']; } } } } else { $referenceKey = $r['seq'].':'.$rr['fieldid'].':'; $moduleInstance1 = Vtecrm_Module::getInstance($rr['module']); $result1 = $adb->pquery("select fieldname, fieldlabel from {$table_prefix}_field where tabid = ? and uitype = ?", array($moduleInstance1->id,220)); if ($result1 && $adb->num_rows($result1) > 0) { while($row1=$adb->fetchByAssoc($result1)) { $bfields[$referenceKey.':'.$row1['fieldname']] = $rr['fieldlabel'].' ('.getTranslatedString($rr['module'],$rr['module']).') : '.$row1['fieldlabel']; } } } //crmv@160368e crmv@160859e } } //crmv@182891e if (!empty($bfields)) { $tfields[$key] = array('label'=>$r['label'], 'fields'=>$bfields); } } } return $tfields; } //crmv@203075 function getAllRelatedModulesForCycle($processmaker) { //getting modulename $modulename = ''; $metadata = $this->getMetadata($processmaker); if(empty($metadata) || !is_array($metadata)){ return []; } foreach($metadata as $k => $v) { if($this->isStartTask($processmaker, $k)) { $modulename = $v['moduleName']; break; } } $focus = RelationManager::getInstance(); $rel = $focus->getRelations($modulename, ModuleRelation::$TYPE_NTON | ModuleRelation::$TYPE_1TON); $allrelations = []; foreach($rel as $k) { if(!in_array($k->getSecondModule(), $this->modules_excluded_link)) $allrelations[] = $k->getSecondModule(); } $tfields = array(); $records = $this->getRecordsInvolved($processmaker); if (!empty($records)) { foreach ($records as $r) { $bfields = array(); $key = $r['seq'].':'.$r['module']; foreach($allrelations as $k => $relation) { $referenceKey = $r['seq'].':'.$k.':' . $modulename . ':' . $relation; $bfields[$referenceKey] = $relation; } if (!empty($bfields)) { $tfields[$key] = array('label'=>$r['label'], 'fields'=>$bfields); } break; } } return $tfields; } //crmv@203075e function getAllTableFieldsOptions($processmaker, &$return) { global $adb, $table_prefix; $records = $this->getRecordsInvolved($processmaker); if (!empty($records)) { foreach($records as $r) { $moduleInstance = Vtecrm_Module::getInstance($r['module']); $result = $adb->pquery("select fieldname, fieldlabel from {$table_prefix}_field where tabid = ? and uitype = ?", array($moduleInstance->id,220)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $this->getTableFieldsOptions($processmaker, $r['seq'], $row['fieldname'], $return, $row['fieldlabel']); } } } } return $return; } function getTableFieldsOptions($processmaker, $metaid, $fieldname, &$return, $fieldlabel='') { require_once('include/utils/ModLightUtils.php'); global $adb, $table_prefix; $modulelightid = str_replace('ml','',$fieldname); if (empty($fieldlabel)) { $result = $adb->pquery("select fieldlabel from {$table_prefix}_field where fieldname = ? and uitype = ?", array($fieldname,220)); if ($result && $adb->num_rows($result) > 0) { $fieldlabel = $adb->query_result($result,0,'fieldlabel'); } } $MLUtils = ModLightUtils::getInstance(); $processDynaForm = ProcessDynaForm::getInstance(); $columns = $MLUtils->getColumns('', $fieldname); if (!empty($columns)) { $groupLabel = $this->getRecordsInvolvedLabel($processmaker,$metaid)." : $fieldlabel"; foreach($columns as $column) { $value = "\${$metaid}-{$fieldname}::".$column['fieldname']; $processDynaForm->categorizeFieldByType($return, $column, $groupLabel, $value); } } return $return; } // crmv@195745 public function getAllProductsBlocks($processmaker) { global $adb, $table_prefix; $tfields = array(); $records = $this->getRecordsInvolved($processmaker); if (!empty($records)) { $FM = new FakeModules(); $label = $FM->getModuleLabel('ProductsBlock'); foreach($records as $r) { if (isInventoryModule($r['module'])) { $key = $r['seq'].':'.$r['module']; $fkey = $r['seq'].':0:ProductsBlock:prodblock'; //crmv@182891 $tfields[$key] = array('label'=>$r['label'], 'fields'=>array($fkey => $label)); } } } return $tfields; } function getAllPBlockFieldsOptions($processmaker, &$return) { $records = $this->getRecordsInvolved($processmaker); if (!empty($records)) { $FM = new FakeModules(); $label = $FM->getModuleLabel('ProductsBlock'); $pfields = null; $processDynaForm = ProcessDynaForm::getInstance(); foreach($records as $r) { if (isInventoryModule($r['module'])) { if (is_null($pfields)) { $pfields = $FM->getFields('ProductsBlock'); unset($pfields['id'], $pfields['total_notaxes']); } $metaid = $r['seq']; $groupLabel = $this->getRecordsInvolvedLabel($processmaker,$metaid)." : $label"; foreach ($pfields as $fld) { $value = "\${$metaid}-prodblock::".$fld['fieldname']; $fld['fieldlabel'] = $fld['label']; if ($fld['relmodules']) { $fld['relatedmods'] = implode(',',$fld['relmodules']); } $processDynaForm->categorizeFieldByType($return, $fld, $groupLabel, $value); } } } } return $return; } function replacePBlockFieldTag($parent, $tfield, $tcol, $cycleIndex=null, $relmod = null, $relfield = null) { list($wsModule,$parent_id) = explode('x',$parent); $parent_module = getSalesEntityType($parent_id); static $pblockFieldValues = array(); if (!isset($pblockFieldValues[$parent_id])) { $IU = InventoryUtils::getInstance(); $values = $IU->getProductBlockRows($parent_module, $parent_id, false); $pblockFieldValues[$parent_id] = $values; } $values = $pblockFieldValues[$parent_id]; $replace = $this->applyTableFieldFunct('prodblock', $values, $tfield, $tcol, $cycleIndex, $relmod, $relfield); return $replace; } // crmv@195745e function replaceTableFieldTag($parent, $tfield, $tcol, $cycleIndex=null, $relmod = null, $relfield = null) { // crmv@195745 require_once('include/utils/ModLightUtils.php'); list($wsModule,$parent_id) = explode('x',$parent); $parent_module = getSalesEntityType($parent_id); static $tableFieldValues = array(); if (!isset($tableFieldValues[$tfield][$parent_id])) { $MLUtils = ModLightUtils::getInstance(); $columns = $MLUtils->getColumns($parent_module,$tfield); $tableFieldValues[$tfield][$parent_id] = array(); $values = $MLUtils->getValues($parent_module,$parent_id,$tfield,$columns); if (!empty($values)) { foreach($values as $tmp) { array_push($tableFieldValues[$tfield][$parent_id],$tmp['row']); } } } $values = array_values($tableFieldValues[$tfield][$parent_id]); $replace = $this->applyTableFieldFunct('modulelight', $values, $tfield, $tcol, $cycleIndex, $relmod, $relfield); // crmv@195745 return $replace; } function applyTableFieldFunct($mode, $values, $tfield, $tcol, $cycleIndex=null, $relmod = null, $relfield = null) { // crmv@195745 // crmv@195745 - removed code list($tcol, $funct, $seq) = explode(':',$tcol); $replace = ''; if (!empty($values) && ($funct == 'curr' || isset($values[0][$tcol]))) { // crmv@195745 switch ($funct) { case 'sum': case 'min': case 'max': case 'average': $col_values = array_column($values,$tcol); if ($funct == 'sum') $replace = array_sum($col_values); elseif ($funct == 'min') $replace = min($col_values); elseif ($funct == 'max') $replace = max($col_values); elseif ($funct == 'average') $replace = array_sum($col_values) / count($col_values); break; //crmv@121616 case 'all': case 'at_least_one': $replace = $values; break; //crmv@121616e case 'last': $row = end($values); $replace = $row[$tcol]; break; case 'seq': $row = array_slice($values, $seq-1, 1); $replace = $row[0][$tcol]; break; case 'curr': case '': if (!is_null($cycleIndex)) { if ($mode == 'modulelight') { static $retrievedObject = array(); if (!isset($retrievedObject[$cycleIndex])) { $modulelightname = 'ModLight'.str_replace('ml','',$tfield); $retrievedObject[$cycleIndex] = CRMEntity::getInstance($modulelightname); $retrievedObject[$cycleIndex]->retrieve_entity_info_no_html($cycleIndex,$modulelightname); } $replace = $retrievedObject[$cycleIndex]->column_fields[$tcol]; } else { $row = $values[$cycleIndex]; if (is_array($row) && array_key_exists($tcol, $row)) { $replace = $row[$tcol]; } } // crmv@195745 if ($relmod && $relfield && !empty($replace) && $replace > 0) { // replace is the crmid of another module $replaceMod = getSalesEntityType($replace); if ($replaceMod == $relmod) { $replace = self::getFieldRawValue($relmod, $relfield, $replace); // TODO: handle uitypes formatting } } // crmv@195745e } break; } } return $replace; } //crmv@106857e //crmv@112539 function getLogElement($running_process,$elementid) { global $adb, $table_prefix; $return = array(); $result = $adb->pquery("select info from {$table_prefix}_running_processes_logsi where running_process = ? and elementid = ?", array($running_process, $elementid)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $return[] = Zend_Json::decode($row['info']); } } return $return; } function deleteRecord($processesid,$elementid,$module,$record) { global $adb, $table_prefix; $focusProcesses = CRMEntity::getInstance('Processes'); $focusProcesses->retrieve_entity_info_no_html($processesid,'Processes'); $result = $adb->pquery("select id, info from {$table_prefix}_running_processes_logsi where running_process = ? and elementid = ?", array($focusProcesses->column_fields['running_process'],$elementid)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $info = Zend_Json::decode($row['info']); if ($info['crmid'] == $record) { $adb->pquery("delete from {$table_prefix}_running_processes_logsi where id = ?", array($row['id'])); } } } $adb->pquery("delete from {$table_prefix}_processmaker_rec where crmid = ?", array($record)); $focus = CRMEntity::getInstance($module); $focus->trash($module,$record); } function rollback($mode,$focusProcesses,$elementid='',$prev_elementid='') { //crmv@182554 global $adb, $table_prefix, $current_user; require_once('modules/Settings/ProcessMaker/ProcessMakerEngine.php'); require_once('modules/Settings/ProcessMaker/ProcessDynaForm.php'); require_once('modules/com_workflow/VTEntityCache.inc');//crmv@207901 $entityCache = new VTEntityCache($current_user); //crmv@125434 crmv@180440 crmv@182554 // in TT-180440 you can find a script example for contine execution with processes with multiple flows inside (parallel gateway(s)) $prev_elementid = $this->getCurrentElementId($focusProcesses->column_fields['running_process'],$focusProcesses->id,$elementid); if (empty($prev_elementid)) return false; //crmv@125434e crmv@180440e crmv@182554e $prev_elementid_info = $this->getStructureElementInfo($focusProcesses->column_fields['processmaker'],$prev_elementid,'shapes',$focusProcesses->column_fields['running_process']); if ($mode == 'continue_execution') { $elementid = $prev_elementid; $info = $prev_elementid_info; } else { $info = $this->getStructureElementInfo($focusProcesses->column_fields['processmaker'],$elementid,'shapes',$focusProcesses->column_fields['running_process']); } $engineType = $this->getEngineType($info); if (!in_array($engineType,array('Condition','Action')) || $this->isStartTask($focusProcesses->column_fields['processmaker'],$elementid,$focusProcesses->column_fields['running_process'])) return false; // calculate metaid and wsId if ($engineType == 'Condition') { $data = $this->retrieve($focusProcesses->column_fields['processmaker']); $vte_metadata = Zend_Json::decode($data['vte_metadata']); $metadata = $vte_metadata[$elementid]; if (strpos($metadata['moduleName'],':') === false) { $result = $adb->pquery("SELECT id FROM {$table_prefix}_processmaker_metarec WHERE processid = ? AND elementid = ?", array($focusProcesses->column_fields['processmaker'],$elementid)); if ($result && $adb->num_rows($result) > 0) { $metaid = $adb->query_result($result,0,'id'); $related_to = ProcessMakerEngine::getCrmid($metaid,$focusProcesses->column_fields['running_process']); if (!empty($related_to)) { $wsId = $related_to; //crmv@OPER10174 } } } else { list($metaid,$module) = explode(':',$metadata['moduleName']); if ($module == 'DynaForm') { $processDynaFormObj = ProcessDynaForm::getInstance(); $crmid = $processDynaFormObj->getProcessesId($focusProcesses->column_fields['running_process'],$metaid); $metaid = ''; $wsId = $crmid; //crmv@OPER10174 } else { $related_to = ProcessMakerEngine::getCrmid($metaid,$focusProcesses->column_fields['running_process']); if (!empty($related_to)) { $wsId = $related_to; //crmv@OPER10174 } } } } else { // search record in the element $result = $adb->pquery("SELECT rec.id, rec.crmid FROM {$table_prefix}_processmaker_metarec metarec INNER JOIN {$table_prefix}_processmaker_rec rec ON metarec.id = rec.id AND metarec.processid = ? AND rec.running_process = ? WHERE metarec.elementid = ?", array($focusProcesses->column_fields['processmaker'],$focusProcesses->column_fields['running_process'],$elementid)); if ($adb->num_rows($result) == 0) { // if do not found get the last record $result = $adb->limitpQuery("SELECT id, crmid FROM {$table_prefix}_processmaker_rec WHERE running_process = ? ORDER BY crmid DESC", 0, 1, array($focusProcesses->column_fields['running_process'])); } if ($result && $adb->num_rows($result) > 0) { $metaid = $adb->query_result($result,0,'id'); $wsId = $adb->query_result($result,0,'crmid'); //crmv@OPER10174 } } $wsId = vtws_getWebserviceEntityId(getSalesEntityType($wsId),$wsId); //crmv@OPER10174 //echo $focusProcesses->column_fields['running_process'].','.$focusProcesses->column_fields['processmaker'].",$prev_elementid,$elementid,$wsId,$metaid";die; $PMEngine = ProcessMakerEngine::getInstance($focusProcesses->column_fields['running_process'],$focusProcesses->column_fields['processmaker'],$prev_elementid,$elementid,$wsId,$metaid,$entityCache); $processEnded = $PMEngine->isEndProcess($prev_elementid_info['type']); if ($processEnded) $PMEngine->endProcess(0); if ($mode == 'continue_execution') { $PMEngine->activateProcess(); $PMEngine->execute($engineType,$info['type']); } elseif ($mode == 'change_position') { $PMEngine->log_rollback = $current_user->id; $PMEngine->activateProcess(false); $PMEngine->trackProcess($prev_elementid,$elementid); } return true; } function isEnableRollback() { require('user_privileges/requireUserPrivileges.php'); // crmv@39110 return $is_admin; } function isActiveRunningProcess($running_process) { global $adb, $table_prefix; $result = $adb->pquery("select active from {$table_prefix}_running_processes where id = ?", array($running_process)); $active = false; if ($result && $adb->num_rows($result) > 0) { $active = ($adb->query_result($result,0,'active') == '1'); } return $active; } //crmv@112539e function getAllConditionals($record) { require_once('modules/Settings/ProcessMaker/ProcessMakerEngine.php'); global $adb, $table_prefix; static $conditionals = array(); static $cache = false; if (!$cache) { $result = $adb->pquery("select {$table_prefix}_running_processes.processmakerid, {$table_prefix}_processmaker_conditionals.running_process, {$table_prefix}_running_processes.xml_version_forced, {$table_prefix}_processmaker_conditionals.elementid from {$table_prefix}_processmaker_conditionals inner join {$table_prefix}_running_processes on {$table_prefix}_running_processes.id = {$table_prefix}_processmaker_conditionals.running_process inner join {$table_prefix}_processmaker on {$table_prefix}_processmaker.id = {$table_prefix}_running_processes.processmakerid where {$table_prefix}_processmaker.active = ? and {$table_prefix}_running_processes.active = ? and {$table_prefix}_processmaker_conditionals.crmid = ?", array(1,1,$record)); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result,-1,false)) { $processmakerid = $row['processmakerid']; $running_process = $row['running_process']; $elementid = $row['elementid']; $data = $this->retrieve($processmakerid, $row['xml_version_forced']); $vte_metadata = Zend_Json::decode($data['vte_metadata']); $vte_metadata_conditionals = $vte_metadata[$elementid]['conditionals']; if (!empty($vte_metadata_conditionals)) { foreach($vte_metadata_conditionals as $tmp) { list($metaid,$module) = explode(':',$tmp['moduleName']); $crmid = ProcessMakerEngine::getCrmid($metaid,$running_process); if ($record == $crmid) { $conditionals[] = $tmp; } } } } } $cache = true; } return $conditionals; } function getConditionalPermissions($conditionals, &$column_fields) { global $adb, $table_prefix, $current_user; $column_fields_bkp = $column_fields; $record = $column_fields['record_id']; $module = $column_fields['record_module']; $webserviceObject = VtenextWebserviceObject::fromName($adb,$module);//crmv@207871 $wsRecord = vtws_getId($webserviceObject->getEntityId(),$record); // force cache with column_fields of $_REQUEST in order to manage the live conditionals $cache_column_fields = $column_fields; require_once('modules/com_workflow/VTEntityCache.inc');//crmv@207901 $entityCache = new VTEntityCache($current_user); $entityCache->forId($wsRecord); unset($cache_column_fields['record_id']); unset($cache_column_fields['record_module']); $cache_column_fields['id'] = $wsRecord; $entityCache::$cache[$wsRecord]->data = $cache_column_fields; //crmv@OPER10174 // get fields informations $column_fields_check = $column_fields_bkp; // for table fields check $fields = array(); $tvh_id = $this->getSystemVersion4Record($record,array('tabs',$module,'id')); if (!empty($tvh_id)) { $result = $adb->pquery("select * from {$table_prefix}_field_vh where versionid = ? and tabid = ?", array($tvh_id,getTabid2($module))); } else { $result = $adb->pquery("select * from {$table_prefix}_field where tabid = ?", array(getTabid2($module))); } if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $fields[$row['fieldname']] = WebserviceField::fromArray($adb,$row); if ($fields[$row['fieldname']]->getFieldDataType() == 'table') { if (is_array($column_fields[$row['fieldname']])) { // retrieve from column_fields (EditViewConditionals) $column_fields_check[$row['fieldname']] = $column_fields[$row['fieldname']]['rows']; } else { // retrieve from db require_once('include/utils/ModLightUtils.php'); $MLUtils = ModLightUtils::getInstance(); $columns = $MLUtils->getColumns($module,$row['fieldname']); $column_fields_check[$row['fieldname']] = array(); $values = $MLUtils->getValues($module,$record,$row['fieldname'],$columns); if (!empty($values)) { foreach($values as $tmp) { array_push($column_fields_check[$row['fieldname']],$tmp['row']); } } } } } } $role_grp_checks = array(); //tutti $role_grp_checks[] = 'ALL'; //ruoli $role_grp_checks[] = "roles::".$current_user->roleid; //ruoli e subordinati $subordinates=getRoleAndSubordinatesInformation($current_user->roleid); $parent_role=$subordinates[$current_user->roleid][1]; if (!is_array($parent_role)){ $parent_role = explode('::',$parent_role); foreach ($parent_role as $parent_role_value){ $role_grp_checks[] = "rs::".$parent_role_value; } } //gruppi require('user_privileges/requireUserPrivileges.php'); // crmv@39110 if (is_array($current_user_groups)){ foreach ($current_user_groups as $current_user_groups_value){ $role_grp_checks[] = "groups::".$current_user_groups_value; } } // split standard and table-field conditionals $conditionals_std = array(); $conditionals_tabs = array(); foreach($conditionals as $i => $conditional) { $tab = false; if (!empty($conditional['conditions'])) { foreach($conditional['conditions'] as $subconditions) { if (!empty($subconditions['conditions'])) { foreach($subconditions['conditions'] as $subcondition) { if (isset($subcondition['tabfieldopt'])) { $tab = true; break; } } } } } ($tab) ? $conditionals_tabs[] = $conditionals[$i] : $conditionals_std[] = $conditionals[$i]; } if (!empty($conditionals_tabs)) { $actionType = $this->getActionTypes('Cycle'); require_once($actionType['php_file']); $actionCycle = new $actionType['class'](); } global $edit_view_conditionals_mode; $edit_view_conditionals_mode = true; $permissions = array(); $i = 0; if (!empty($conditionals_std)) { foreach($conditionals_std as $conditional) { $role_grp_check = $conditional['role_grp_check']; if (in_array($role_grp_check,$role_grp_checks)) { $conditions = Zend_Json::encode($conditional['conditions']); if ($this->evaluateCondition($entityCache, $wsRecord, $conditions)) { foreach($column_fields_check as $fieldname => $value) { $perm = $conditional['fpofv'][$fieldname]; $this->setFieldConditionalPermissions($perm, $i, $fieldname, $permissions); $field = $fields[$fieldname]; if (isset($fields[$fieldname]) && $field->getFieldDataType() == 'table') { if (is_array($value)) { foreach($value as $seq => $row) { foreach($row as $column => $column_value) { $perm = $conditional['fpofv'][$fieldname.'::'.$column]; $this->setFieldConditionalPermissions($perm, $i, $fieldname.'_'.$column.'_'.$seq, $permissions); } } } } } $i++; } } } } // check for conditionals in table-fields if (!empty($conditionals_tabs)) { foreach($column_fields_check as $fieldname => $value) { $field = $fields[$fieldname]; if (isset($fields[$fieldname]) && $field->getFieldDataType() == 'table') { if (is_array($value)) { foreach($value as $seq => $row) { foreach($conditionals_tabs as $conditional) { $role_grp_check = $conditional['role_grp_check']; if (in_array($role_grp_check,$role_grp_checks)) { $conditions = Zend_Json::encode($conditional['conditions']); if ($actionCycle->checkRowConditions(null, $column_fields_check, $conditions, $seq)) { // applico permessi alla riga e anche agli altri campi del modulo $fpofv = $conditional['fpofv']; foreach($fpofv as $f => $fp) { // if it is a column of the current table-field OK // if it is a column of another table-field SKIP // if it is a standard field OK if (strpos($f,'::') !== false) { list($f1,$f2) = explode('::',$f); if ($f1 == $fieldname) { $this->setFieldConditionalPermissions($fp, $i, $f1.'_'.$f2.'_'.$seq, $permissions); } } else { $this->setFieldConditionalPermissions($fp, $i, $f, $permissions); } } $i++; } } } } } } } } // set in request cache $cache = RCache::getInstance(); $cache->set('conditional_permissions', $permissions); $conditional_permissions = array(); if (!empty($permissions)) { // permissions for table field are managed in TableFieldUtils::generateRowVars $fieldids = array(); $result = $adb->pquery("select fieldid, fieldname from {$table_prefix}_field where tabid = ? and fieldname in (".generateQuestionMarks(array_keys($permissions)).")", array(getTabid($module),array_keys($permissions))); if ($result && $adb->num_rows($result) > 0) { while($row=$adb->fetchByAssoc($result)) { $fieldids[$row['fieldname']] = $row['fieldid']; } } foreach($permissions as $fieldname => $permission) { if (!isset($fieldids[$fieldname])) continue; if ($permission['readonly'] == 99) { $f2fp_visible = 1; $f2fp_editable = 0; } elseif ($permission['readonly'] == 100) { $f2fp_visible = 0; $f2fp_editable = 0; } else { $f2fp_visible = 1; $f2fp_editable = 1; } $conditional_permissions[$fieldids[$fieldname]] = Array( 'f2fp_visible'=>$f2fp_visible, 'f2fp_editable'=>$f2fp_editable, 'f2fp_mandatory'=>($permission['mandatory'] == 1)?1:0, ); if (isset($permission['value'])) { $column_fields[$fieldname] = $this->replaceTags($permission['value'],$column_fields_bkp); } } } return $conditional_permissions; } //crmv@105312 crmv@112297 function setFieldConditionalPermissions($perm, $i, $fieldname, &$permissions) { if ($perm['FpovManaged'] == 1) { if ($i == 0) { $permissions[$fieldname]['readonly'] = 1; $permissions[$fieldname]['mandatory'] = false; } if ($perm['FpovReadPermission'] == 1) { if ($perm['FpovWritePermission'] == 1) { $readonly = 1; if ($perm['FpovMandatoryPermission'] == 1) { $permissions[$fieldname]['mandatory'] = true; } } else { $readonly = 99; } } else { $readonly = 100; } //crmv@103826 // the first conditional overwrite the standard permissions // or if there are more conditionals verified set the most restrictive rule if ($i == 0 || $readonly > $permissions[$fieldname]['readonly']) { $permissions[$fieldname]['readonly'] = $readonly; } if ($perm['FpovValueActive'] == 1) $permissions[$fieldname]['value'] = $perm['FpovValueStr']; //crmv@103826e } } function replaceTags($value, $columns, $selector='/(\$([a-zA-Z0-9_]+))/', $row=null) { // crmv@200250 // 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]); if (!empty($params)) { $params = explode(',',$params); array_walk($params, function(&$v,$k) { $v = trim($v); }); // repalce tags foreach($params as &$param) { preg_match_all($selector, $param, $matches, PREG_SET_ORDER); if (!empty($matches)) { // crmv@200250 if ($row !== null && strpos($param,'::') !== false) { list($ml,$fieldname) = explode('::',$param); $ml = str_replace('$','',$ml); $param = $columns[$ml][$row][$fieldname]; } else { $fieldname = str_replace('$','',$param); $param = $columns[$fieldname]; } // crmv@200250e } } } else { $params = array(); } require_once($sdkFieldConditions[$funct]['src']); $replacement = call_user_func_array($funct, $params); } else { $replacement = ''; } $value = str_replace($tag,$replacement,$value); } } // replace tags preg_match_all($selector, $value, $matches, PREG_SET_ORDER); if (!empty($matches)) { foreach($matches as $match) { $fieldname = str_replace('$','',$match[0]); $fieldvalue = $columns[$fieldname]; $value = str_replace($match[0],$fieldvalue,$value); } } return $value; } //crmv@105312e crmv@112297e //crmv@115268 function preserveRequest() { array_push($this->preserved_request, $_REQUEST); $_REQUEST = array(); } function restoreRequest() { $_REQUEST = array_pop($this->preserved_request); } function setDefaultDataFormat() { global $current_user; $this->preserved_date_format = $current_user->date_format; $current_user->date_format = 'yyyy-mm-dd'; $current_user->column_fields['date_format'] = 'yyyy-mm-dd'; } function restoreDataFormat() { global $current_user; $current_user->date_format = $this->preserved_date_format; $current_user->column_fields['date_format'] = $this->preserved_date_format; } //crmv@115268e // crmv@171524 function getRecordsBrothers($crmid, $status = 'all', $check_trigger_queue = false) { global $adb, $table_prefix; $brothers = array(); $query = "select {$table_prefix}_processmaker_rec.running_process from {$table_prefix}_processmaker_rec"; if ($status != 'all') $query .= " inner join {$table_prefix}_running_processes on {$table_prefix}_running_processes.id = {$table_prefix}_processmaker_rec.running_process"; $query .= " where crmid = ?"; $params = array($crmid); if ($status != 'all') { $query .= " and {$table_prefix}_running_processes.end = ?"; $params[] = ($status == 'running') ? 0 : 1; } $result = $adb->pquery($query, $params); if ($result && $adb->num_rows($result) > 0) { $running_process = array(); while ($row = $adb->fetchByAssoc($result)) { $running_process[] = $row['running_process']; } $query = "select distinct {$table_prefix}_processmaker_rec.crmid from {$table_prefix}_processmaker_rec"; if ($check_trigger_queue) $query .= " inner join {$table_prefix}_trigger_queue on {$table_prefix}_trigger_queue.crmid = {$table_prefix}_processmaker_rec.crmid"; $query .= " where running_process in (" . generateQuestionMarks($running_process) . ") and {$table_prefix}_processmaker_rec.crmid <> ?"; $result = $adb->pquery($query, array($running_process, $crmid)); if ($result && $adb->num_rows($result) > 0) { while ($row = $adb->fetchByAssoc($result)) { $brothers[] = $row['crmid']; } } } return $brothers; } // crmv@171524e //crmv@147720 crmv@155375 function compareVersionNumber($version1, $operator, $version2) { return version_compare($version1, $version2, $operator); } function getNewVersionNumber($processmakerid) { $data = $this->retrieve($processmakerid); $current_version = $data['version']; if (empty($current_version)) { $version = $this->startVersionNumber; } else { $v = explode('.', $current_version); $v[count($v)-1]++; $version = implode('.', $v); } return $version; } function incrementVersion($processmakerid, $force_version=false) { global $adb, $table_prefix; $this->historicizeSaveForceVersion($processmakerid, $force_version); $version = $this->getNewVersionNumber($processmakerid); $adb->pquery("update {$this->table_name} set version=?, pending_changes=? where id=?", array($version, 0, $processmakerid)); return $version; } function historicizeSaveForceVersion($processmakerid, $force_version=false) { global $adb, $table_prefix; $data = $this->retrieve($processmakerid); $current_xml_version = $data['xml_version']; $this->historicizeVersionTables($current_xml_version, $processmakerid); $new_xml_version = $this->saveVersion($processmakerid); // force new row in _processmaker_versions with the last structure and metadata if ($force_version) { // close pending versions of tabs, roles, profiles, conditionals $pendings = array(); if ($this->checkPendingRelatedSystemVersions($processmakerid,$pendings)) { foreach($pendings as $type => $info) { if ($type == 'tabs') { foreach($info as $m => $p) { if ($p) { require_once('modules/Settings/LayoutBlockListUtils.php'); $layoutBlockListUtils = LayoutBlockListUtils::getInstance(); $layoutBlockListUtils->closeVersion($m); } } } else { if ($info) { if ($type == 'roles') { require_once('include/utils/UserInfoUtil.php'); $userInfoUtils = UserInfoUtils::getInstance(); $userInfoUtils->closeVersion_role(); } elseif ($type == 'profiles') { require_once('include/utils/UserInfoUtil.php'); $userInfoUtils = UserInfoUtils::getInstance(); $userInfoUtils->closeVersion_profile(); } elseif ($type == 'conditionals') { require_once('modules/Conditionals/ConditionalsVersioning.php'); $conditionalsVersioning = ConditionalsVersioning::getInstance(); $conditionalsVersioning->closeVersion(); } } } } } // save version of tabs, roles, profiles, conditionals associated to this process version $this->saveRelatedSystemVersions($processmakerid,$current_xml_version); // save xml_version_forced in _running_processes $adb->pquery("update {$table_prefix}_running_processes set xml_version_forced = ? where processmakerid = ? and active = 1 and end = 0 and version_chosen = 0 and (xml_version_forced is null or xml_version_forced = '')", array($current_xml_version,$processmakerid)); } else { // update xml_version (used only for the graph) with the last version because the user choose to use LBL_NEW_VERSION(Usa recente) instead of LBL_OLD_VERSION(Congela) $adb->pquery("update {$table_prefix}_running_processes set xml_version = ? where processmakerid = ? and active = 1 and end = 0 and version_chosen = 0 and (xml_version_forced is null or xml_version_forced = '')", array($new_xml_version, $processmakerid)); } $adb->pquery("update {$table_prefix}_running_processes set version_chosen = 1 where processmakerid = ? and active = 1 and end = 0 and version_chosen = 0", array($processmakerid)); } function saveVersion($processmakerid) { global $adb, $table_prefix, $current_user; $result = $adb->pquery("select * from {$this->table_name} where id = ?", array($processmakerid)); $xml_version = $adb->query_result($result,0,'xml_version'); $xml_old = $adb->query_result_no_html($result,0,'xml'); $vte_metadata = $adb->query_result_no_html($result,0,'vte_metadata'); $structure = $adb->query_result_no_html($result,0,'structure'); $helper = $adb->query_result_no_html($result,0,'helper'); $version = $adb->query_result_no_html($result,0,'version'); $adb->pquery("insert into {$table_prefix}_processmaker_versions(processmakerid,xml_version,userid,date_version,vte_metadata,structure,helper,version) values(?,?,?,?,?,?,?,?)", array($processmakerid,$xml_version,$current_user->id,date('Y-m-d H:i:s'),$vte_metadata,$structure,$helper,$version)); $adb->updateClob("{$table_prefix}_processmaker_versions",'xml',"processmakerid=$processmakerid and xml_version=$xml_version",$xml_old); // increment xml_version $next_xml_version = $xml_version+1; $adb->pquery("update {$this->table_name} set xml_version=? where id=?", array($next_xml_version, $processmakerid)); return $next_xml_version; } function historicizeVersionTables($versionid, $processmakerid) { global $adb, $table_prefix; require_once('include/utils/UserInfoUtil.php'); $userInfoUtils = UserInfoUtils::getInstance(); $userInfoUtils->historicizeVersionTables($versionid, array( array( 'table'=>$table_prefix.'_process_dynaform_meta', 'condition'=>"processid = $processmakerid", ), array( 'table'=>$table_prefix.'_process_extws_meta', 'condition'=>"processid = $processmakerid", ), array( 'table'=>$table_prefix.'_processmaker_metarec', 'condition'=>"processid = $processmakerid", ), array( 'table'=>$table_prefix.'_processmaker_rel', 'condition'=>"processid = $processmakerid", ), array( 'table'=>$table_prefix.'_processmaker_rel', 'condition'=>"related = $processmakerid", ), array( 'table'=>$table_prefix.'_subprocesses', 'condition'=>"processid = $processmakerid", ), )); } function checkIncrementVersion($processmakerid) { global $adb, $table_prefix; $check = '0'; $result = $adb->pquery("select count(*) as \"count\" from {$table_prefix}_running_processes where processmakerid = ? and active = 1 and end = 0 and version_chosen = 0 and (xml_version_forced is null or xml_version_forced = '')", array($processmakerid)); if ($result && $adb->num_rows($result) > 0 && intval($adb->query_result($result,0,'count')) > 0) { $check = '1'; $pendings = array(); if ($this->checkPendingRelatedSystemVersions($processmakerid,$pendings)) { $check = array(); foreach($pendings as $type => $info) { if ($type == 'tabs') { foreach($info as $m => $p) { if ($p) $check[] = getTranslatedString('LBL_LAYOUT_EDITOR','Settings').' '.getTranslatedString($m,$m); } } else { if ($info) { if ($type == 'roles') $check[] = getTranslatedString('LBL_ROLES','Settings'); elseif ($type == 'profiles') $check[] = getTranslatedString('LBL_PROFILES','Settings'); elseif ($type == 'conditionals') $check[] = getTranslatedString('Conditionals','Conditionals'); } } } $check = Zend_Json::encode($check); } } return $check; } function checkPendingRelatedSystemVersions($processmakerid, &$pendings=array()) { require_once('include/utils/UserInfoUtil.php'); require_once('modules/Settings/LayoutBlockListUtils.php'); require_once('modules/Conditionals/ConditionalsVersioning.php'); $userInfoUtils = UserInfoUtils::getInstance(); $layoutBlockListUtils = LayoutBlockListUtils::getInstance(); $conditionalsVersioning = ConditionalsVersioning::getInstance(); $pending = false; $tabs = $this->getRecordsInvolvedModules($processmakerid,true,true); if (!empty($tabs)) { foreach($tabs as $module) { $p = $layoutBlockListUtils->getPendingVersion(getTabid2($module)); $pendings['tabs'][$module] = (!empty($p)); if(!empty($p)) $pending = true; } } $rolePendingVersion = $userInfoUtils->getPendingVersion_role(); $pendings['roles'] = (!empty($rolePendingVersion)); if(!empty($rolePendingVersion)) $pending = true; $profilePendingVersion = $userInfoUtils->getPendingVersion_profile(); $pendings['profiles'] = (!empty($profilePendingVersion)); if(!empty($profilePendingVersion)) $pending = true; $conditionalPendingVersion = $conditionalsVersioning->getPendingVersion(); $pendings['conditionals'] = (!empty($conditionalPendingVersion)); if(!empty($conditionalPendingVersion)) $pending = true; return $pending; } function saveRelatedSystemVersions($processmakerid, $xml_version) { global $adb, $table_prefix; require_once('include/utils/UserInfoUtil.php'); $userInfoUtils = UserInfoUtils::getInstance(); $versions = $userInfoUtils->getCurrentVersionNumbers(array('tabs','roles','profiles','conditionals'),array('tabs'=>$this->getRecordsInvolvedModules($processmakerid,true,true))); $adb->pquery("update {$table_prefix}_processmaker_versions set system_versions = ? where processmakerid = ? and xml_version = ?", array(Zend_Json::encode($versions), $processmakerid, $xml_version)); } function getSystemVersion4Record($record, $params=array()) { global $adb, $table_prefix; if (empty($adb) || !Vtecrm_Utils::CheckTable($table_prefix.'_processmaker_rec')) return false; static $cache = array(); if (!isset($cache[$record])) { $cache[$record] = false; // use current system configuration (default) $result = $adb->pquery("select vers.xml_version, vers.system_versions from {$table_prefix}_processmaker_rec rec inner join {$table_prefix}_running_processes run on rec.running_process = run.id left join {$table_prefix}_processmaker_versions vers on run.processmakerid = vers.processmakerid and run.xml_version_forced = vers.xml_version where rec.crmid = ? order by vers.xml_version", array($record)); if ($result && $adb->num_rows($result) > 0) { $xml_version = $adb->query_result($result,0,'xml_version'); if (empty($xml_version)) { // use current system configuration } else { // use last configuration applied $system_versions = Zend_Json::decode($adb->query_result_no_html($result,0,'system_versions')); //crmv@150751 filtro e tengo solo le versioni vecchie: se la versione salvata รจ uguale a quella corrente salto if (!empty($system_versions) && !empty($system_versions['tabs'])) { require_once('include/utils/UserInfoUtil.php'); $userInfoUtils = UserInfoUtils::getInstance(); $current_versions = $userInfoUtils->getCurrentVersionNumbers(array('tabs','roles','profiles','conditionals'),array('tabs'=>array_keys($system_versions['tabs']))); if (!empty($current_versions)) { foreach($current_versions as $cv_type => $cv_info) { if ($cv_type == 'tabs') { if (!empty($cv_info)) { foreach($cv_info as $c_module => $c_module_info) { if ($c_module_info['id'] == $system_versions['tabs'][$c_module]['id']) unset($system_versions['tabs'][$c_module]); } } if (empty($system_versions['tabs'])) unset($system_versions['tabs']); } else { if ($cv_info['id'] == $system_versions[$cv_type]['id']) unset($system_versions[$cv_type]); } } } } //crmv@150751e $cache[$record] = $system_versions; $cache[$running_process]['processmaker'] = array('xml_version'=>$xml_version,'version'=>$adb->query_result($result,0,'version')); } } } if ($cache[$record] === false) { return false; } else { $return = $cache[$record]; if (!empty($params)) { foreach($params as $param) { $return = $return[$param]; } } return $return; } } function getSystemVersion4RunningProcess($running_process, $params=array()) { global $adb, $table_prefix; static $cache = array(); if (!isset($cache[$running_process])) { $cache[$running_process] = false; // use current system configuration (default) $result = $adb->pquery("select vers.xml_version, vers.version, vers.system_versions from {$table_prefix}_running_processes run left join {$table_prefix}_processmaker_versions vers on run.processmakerid = vers.processmakerid and run.xml_version_forced = vers.xml_version where run.id = ? order by vers.xml_version", array($running_process)); if ($result && $adb->num_rows($result) > 0) { $xml_version = $adb->query_result($result,0,'xml_version'); if (empty($xml_version)) { // use current system configuration } else { // use last configuration applied $system_versions = Zend_Json::decode($adb->query_result_no_html($result,0,'system_versions')); $cache[$running_process] = $system_versions; $cache[$running_process]['processmaker'] = array('xml_version'=>$xml_version,'version'=>$adb->query_result($result,0,'version')); } } } if ($cache[$running_process] === false) { return false; } else { $return = $cache[$running_process]; if (!empty($params)) { foreach($params as $param) { $return = $return[$param]; } } return $return; } } //crmv@147720e crmv@155375e //crmv@153321_5 function getCache($item) { if ($this->cacheStorage == 'session') { $cacheInstance = SCache::getInstance(); $cache = $cacheInstance->get('processmaker'); return $cache[$item]; } elseif ($this->cacheStorage == 'file') { $cacheInstance = new CacheStorageFile('cache/processmaker.tmp', 'json'); return $cacheInstance->get($item); } } function setCache($item,$value) { if ($this->cacheStorage == 'session') { $cacheInstance = SCache::getInstance(); $cache = $cacheInstance->get('processmaker'); if (empty($cache)) $cache = array(); $cache[$item] = $value; $cacheInstance->set('processmaker',$cache); } elseif ($this->cacheStorage == 'file') { $cacheInstance = new CacheStorageFile('cache/processmaker.tmp', 'json'); $cacheInstance->set($item,$value); } } function clearCache($item) { if ($this->cacheStorage == 'session') { $cacheInstance = SCache::getInstance(); $cache = $cacheInstance->get('processmaker'); unset($cache[$item]); $cacheInstance->set('processmaker',$cache); } elseif ($this->cacheStorage == 'file') { $cacheInstance = new CacheStorageFile('cache/processmaker.tmp', 'json'); $cacheInstance->clear($item); } } function clearProcessMakerCache($processmakerid) { if ($this->cacheStorage == 'session') { $cacheInstance = SCache::getInstance(); $cache = $cacheInstance->get('processmaker'); unset($cache['processmaker_describe_modules_'.$processmakerid]); unset($cache['processmaker_entity_options_'.$processmakerid]); $cacheInstance->set('processmaker',$cache); } elseif ($this->cacheStorage == 'file') { $cacheInstance = new CacheStorageFile('cache/processmaker.tmp', 'json'); $cacheInstance->clear('processmaker_describe_modules_'.$processmakerid); $cacheInstance->clear('processmaker_entity_options_'.$processmakerid); } } //crmv@153321_5e //crmv@182554 function sortTags(&$matches) { $ordered_matches = Array(); foreach($matches as $matchid=>$matcharr){ $ordered_matches[$matchid] = strlen($matcharr[0]); } arsort($ordered_matches); $new_matches = Array(); foreach($ordered_matches as $ordid=>$ordlen){ $new_matches[] = $matches[$ordid]; } $matches = $new_matches; unset($new_matches,$ordered_matches); } //crmv@182554e //crmv@185361 function getAttacherFather($id,$elementid) { $structure = $this->getStructure($id); foreach($structure['tree'] as $shapeid => $info) { $attachers = $info['attachers']; if (!empty($attachers)) { if (in_array($elementid,$attachers)) return $shapeid; } } } //crmv@185361e //crmv@185548 function get_all_related_modules($related_modules){ global $adb, $table_prefix; $modules_not_supported = array("Sms", "Fax", "Processes"); // crmv@202102 $modules_list = array(); foreach($related_modules as $index => $field){ $relationid = $field->relationid; $query = "SELECT {$table_prefix}_tab.name FROM {$table_prefix}_tab INNER JOIN {$table_prefix}_relatedlists ON {$table_prefix}_tab.tabid = {$table_prefix}_relatedlists.related_tabid WHERE relation_id = ?"; $res = $adb->pquery($query, array($relationid)); if($res && $adb->num_rows($res) > 0){ $rel_modulename = $adb->query_result($res, 0, "name"); if(!(in_array($rel_modulename, $modules_not_supported))){ if($rel_modulename == "Calendar"){ //Split Activities module $modules_list[] = "Events"; $modules_list[] = "Calendar"; } elseif($rel_modulename == "Newsletter"){ $modules_list[] = "Newsletter"; } else{ $modules_list[] = $rel_modulename; } } } } return $modules_list; } //crmv@185548e } require_once('modules/Settings/ModuleMaker/ModuleMakerGenerator.php'); class ProcessModuleMakerGenerator extends ModuleMakerGenerator { function __construct() {} //crmv@145432 function getTODForField($field) { $tod = parent::getTODForField($field); if (in_array($field['fieldwstype'],array('integer','double')) && isset($field['length']) && isset($field['decimals'])) { $decimals = intval($field['decimals']); $length = $field['length'] - $decimals; $tod = 'N~O~'.$length.','.$decimals; } elseif ($field['fieldwstype'] == 'string') { if (!empty($field['length'])) $tod = 'V~O~LE~'.$field['length']; } return $tod; } //crmv@145432e function makeTODMandatory($tod) { return parent::makeTODMandatory($tod); } } require_once('modules/Settings/ModuleMaker/ModuleMakerSteps.php'); class ProcessModuleMakerSteps extends ModuleMakerSteps { function getNewFields() { //crmv@160837 static $fields = array(); if (!empty($fields)) return $fields; //crmv@160837e $unsupported_uitypes = array(1015,4); $fields = parent::getNewFields(); foreach($fields as $i => $field) { if(in_array($field['uitype'],$unsupported_uitypes)) unset($fields[$i]); } //crmv@98570 crmv@102879 $PMUtils = ProcessMakerUtils::getInstance(); if (SDK::isUitype(213)) { $fields[] = array( 'uitype' => 213, 'label' => getTranslatedString('LBL_FIELD_BUTTON'), 'vteicon2' => 'fa-hand-pointer-o', 'properties' => array('label','onclick','code'), 'defaults' => array('onclick'=>'function(view[,param])'), ); } if (SDK::isUitype(220)) { $fields[] = array( 'uitype' => 220, 'label' => getTranslatedString('LBL_FIELD_TABLE'), 'vteicon' => 'grid_on', 'properties' => array('label','columns'), ); } //crmv@98570e crmv@102879e /* crmv@174986 if (SDK::isUitype(221)) { $fields[] = array( 'uitype' => 221, 'label' => getTranslatedString('LBL_ROLE'), 'vteicon' => 'people', 'properties' => array('label'), ); } crmv@174986e */ $fields = array_values($fields); //crmv@106857 return $fields; } //crmv@106857 function getNewTableFieldColumns() { //crmv@160837 static $fields = array(); if (!empty($fields)) return $fields; //crmv@160837e $unsupported_uitypes = array(213,220/*,10*/,29); $fields = $this->getNewFields(); foreach($fields as $i => $field) { if(in_array($field['uitype'],$unsupported_uitypes)) { unset($fields[$i]); continue; } // add other properties $fields[$i]['properties'][] = 'readonly'; $fields[$i]['properties'][] = 'mandatory'; $fields[$i]['properties'][] = 'newline'; // add defaults for other properties $fields[$i]['defaults']['readonly'] = 1; $fields[$i]['defaults']['mandatory'] = false; } return $fields; } //crmv@106857e }