From 9b60fdb68235aaca8b507f69bc018edbe07db1a5 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Fri, 25 Nov 2016 13:06:25 -0500 Subject: [PATCH] HOR-2282 --- workflow/engine/classes/class.derivation.php | 10 ++- workflow/engine/classes/class.plugin.php | 47 ++++++++++- .../engine/classes/class.pluginRegistry.php | 53 ++++++++++++ .../classes/model/map/TaskMapBuilder.php | 2 +- workflow/engine/config/schema.xml | 2 +- .../translations/english/processmaker.en.po | 6 ++ workflow/engine/controllers/designer.php | 20 +++++ workflow/engine/data/mysql/insert.sql | 1 + workflow/engine/methods/cases/cases_Step.php | 3 + .../Project/Adapter/BpmnWorkflow.php | 80 +++++++++++++++++-- .../src/ProcessMaker/Project/Workflow.php | 13 +++ .../cases/cases_ScreenDerivation.html | 5 ++ workflow/engine/templates/designer/index.html | 6 ++ 13 files changed, 236 insertions(+), 12 deletions(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index c74f137d1..814f74c92 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -141,7 +141,7 @@ class Derivation $arrayTaskData["NEXT_TASK"]["TAS_PARENT"] = ""; } - $regexpTaskTypeToExclude = "GATEWAYTOGATEWAY|END-MESSAGE-EVENT|SCRIPT-TASK|INTERMEDIATE-CATCH-TIMER-EVENT|INTERMEDIATE-THROW-MESSAGE-EVENT|END-EMAIL-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT|INTERMEDIATE-CATCH-MESSAGE-EVENT"; + $regexpTaskTypeToExclude = "GATEWAYTOGATEWAY|END-MESSAGE-EVENT|SCRIPT-TASK|SERVICE-TASK|INTERMEDIATE-CATCH-TIMER-EVENT|INTERMEDIATE-THROW-MESSAGE-EVENT|END-EMAIL-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT|INTERMEDIATE-CATCH-MESSAGE-EVENT"; $arrayTaskData["NEXT_TASK"]["USER_ASSIGNED"] = (!preg_match("/^(?:" . $regexpTaskTypeToExclude . ")$/", $arrayTaskData["NEXT_TASK"]["TAS_TYPE"]))? $this->getNextAssignedUser($arrayTaskData) : array("USR_UID" => "", "USR_FULLNAME" => ""); } @@ -1099,6 +1099,10 @@ class Derivation } break; } + //Execute Service Task + if (function_exists('executeServiceTaskByActivityUid')) { + $appFields["APP_DATA"] = executeServiceTaskByActivityUid($nextDel["TAS_UID"], $appFields); + } //Execute Script-Task $scriptTask = new \ProcessMaker\BusinessModel\ScriptTask(); @@ -1106,7 +1110,7 @@ class Derivation $appFields["APP_DATA"] = $scriptTask->execScriptByActivityUid($nextDel["TAS_UID"], $appFields); //Create record in table APP_ASSIGN_SELF_SERVICE_VALUE - $regexpTaskTypeToExclude = "SCRIPT-TASK|INTERMEDIATE-THROW-EMAIL-EVENT"; + $regexpTaskTypeToExclude = "SCRIPT-TASK|INTERMEDIATE-THROW-EMAIL-EVENT|SERVICE-TASK"; if (!is_null($taskNextDel) && !preg_match("/^(?:" . $regexpTaskTypeToExclude . ")$/", $taskNextDel->getTasType())) { if ($taskNextDel->getTasAssignType() == "SELF_SERVICE" && trim($taskNextDel->getTasGroupVariable()) != "") { @@ -1126,7 +1130,7 @@ class Derivation } //Check if $taskNextDel is Script-Task - if (!is_null($taskNextDel) && ($taskNextDel->getTasType() === "SCRIPT-TASK" || $taskNextDel->getTasType() === "INTERMEDIATE-THROW-EMAIL-EVENT" || $taskNextDel->getTasType() === "INTERMEDIATE-THROW-MESSAGE-EVENT")) { + if (!is_null($taskNextDel) && ($taskNextDel->getTasType() === "SCRIPT-TASK" || $taskNextDel->getTasType() === "INTERMEDIATE-THROW-EMAIL-EVENT" || $taskNextDel->getTasType() === "INTERMEDIATE-THROW-MESSAGE-EVENT" || $taskNextDel->getTasType() === "SERVICE-TASK")) { //Get for $nextDel["TAS_UID"] your next Task $currentDelegationAux = array_merge($currentDelegation, array("DEL_INDEX" => $iNewDelIndex, "TAS_UID" => $nextDel["TAS_UID"])); $nextDelegationsAux = array(); diff --git a/workflow/engine/classes/class.plugin.php b/workflow/engine/classes/class.plugin.php index 0a25da383..b5d921d47 100644 --- a/workflow/engine/classes/class.plugin.php +++ b/workflow/engine/classes/class.plugin.php @@ -396,7 +396,7 @@ class PMPlugin throw $e; } } - + /** * Changes the menu properties from the given processmaker section and menu id * @@ -415,7 +415,7 @@ class PMPlugin throw $e; } } - + /** * callBack File after import process * @@ -449,6 +449,49 @@ class PMPlugin throw $e; } } + + /** + * Path registry to file js or css. + * @param type $pathFile + * @param string $scope + * @throws Exception + */ + public function registerDesignerSourcePath($pathFile, $scope = null) + { + if ($scope === null) { + $scope = '/plugin/' . $this->sNamespace . '/'; + } + try { + $pluginRegistry = &PMPluginRegistry::getSingleton(); + $pluginRegistry->registerDesignerSourcePath($this->sNamespace, $scope . $pathFile); + } catch (Exception $e) { + throw $e; + } + } + + /** + * Enable build js or css into build.json paths. + * @param type $sourcePath + */ + public function enableExtensionSources($sourcePath = 'config/build.json') + { + $path = PATH_PLUGINS . $this->sPluginFolder . "/"; + $buildFile = $path . $sourcePath; + if (is_file($buildFile)) { + $buildObjects = G::json_decode(file_get_contents($buildFile)); + foreach ($buildObjects as $item) { + $item->path = $path . rtrim($item->path, "/\\"); + $extensionPath = "extension-" . $item->name . "-" . G::browserCacheFilesGetUid() . "." . $item->extension; + $file = $path . "public_html/" . $extensionPath; + @file_put_contents($file, "", LOCK_EX); + foreach ($item->files as $name) { + @file_put_contents($file, file_get_contents($item->path . "/" . $name), FILE_APPEND | LOCK_EX); + } + $this->registerDesignerSourcePath($extensionPath); + } + } + } + } class menuDetail diff --git a/workflow/engine/classes/class.pluginRegistry.php b/workflow/engine/classes/class.pluginRegistry.php index 98ec21f23..cd7e0f46d 100644 --- a/workflow/engine/classes/class.pluginRegistry.php +++ b/workflow/engine/classes/class.pluginRegistry.php @@ -105,6 +105,7 @@ class PMPluginRegistry private $_aMenuOptionsToReplace = array (); private $_aImportProcessCallbackFile = array (); private $_aOpenReassignCallback = array (); + private $_arrayDesignerSourcePath = array(); /** * Registry a plugin javascript to include with js core at same runtime @@ -408,6 +409,12 @@ class PMPluginRegistry unset($this->_arrayDesignerMenu[$key]); } } + + foreach ($this->_arrayDesignerSourcePath as $key => $detail) { + if ($detail->pluginName == $sNamespace) { + unset($this->_arrayDesignerSourcePath[$key]); + } + } if(sizeof( $this->_aMenuOptionsToReplace )){ unset( $this->_aMenuOptionsToReplace ); @@ -1849,4 +1856,50 @@ class PMPluginRegistry } return $enabledPlugins; } + + /** + * Registry in an array routes for js or css files. + * @param type $pluginName + * @param type $pathFile + * @throws Exception + */ + public function registerDesignerSourcePath($pluginName, $pathFile) + { + try { + $flagFound = false; + + foreach ($this->_arrayDesignerSourcePath as $value) { + if ($value->pluginName == $pluginName && $value->pathFile == $pathFile) { + $flagFound = true; + break; + } + } + + if (!$flagFound) { + $obj = new stdClass(); + $obj->pluginName = $pluginName; + $obj->pathFile = $pathFile; + + $this->_arrayDesignerSourcePath[] = $obj; + } + } catch (Exception $e) { + throw $e; + } + } + + /** + * You obtain an array containing the routes recorded by the + * function registerDesignerSourcePath. + * @return type + * @throws Exception + */ + public function getDesignerSourcePath() + { + try { + return $this->_arrayDesignerSourcePath; + } catch (Exception $e) { + throw $e; + } + } + } diff --git a/workflow/engine/classes/model/map/TaskMapBuilder.php b/workflow/engine/classes/model/map/TaskMapBuilder.php index f496fd1ad..c06295358 100644 --- a/workflow/engine/classes/model/map/TaskMapBuilder.php +++ b/workflow/engine/classes/model/map/TaskMapBuilder.php @@ -195,7 +195,7 @@ class TaskMapBuilder $tMap->addColumn('TAS_RECEIVE_MESSAGE', 'TasReceiveMessage', 'string', CreoleTypes::LONGVARCHAR, false, null); - $tMap->addValidator('TAS_TYPE', 'validValues', 'propel.validator.ValidValuesValidator', 'NORMAL|ADHOC|SUBPROCESS|HIDDEN|GATEWAYTOGATEWAY|WEBENTRYEVENT|END-MESSAGE-EVENT|START-MESSAGE-EVENT|INTERMEDIATE-THROW-MESSAGE-EVENT|INTERMEDIATE-CATCH-MESSAGE-EVENT|SCRIPT-TASK|START-TIMER-EVENT|INTERMEDIATE-CATCH-TIMER-EVENT|END-EMAIL-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT', 'Please set a valid value for TAS_TYPE'); + $tMap->addValidator('TAS_TYPE', 'validValues', 'propel.validator.ValidValuesValidator', 'NORMAL|ADHOC|SUBPROCESS|HIDDEN|GATEWAYTOGATEWAY|WEBENTRYEVENT|END-MESSAGE-EVENT|START-MESSAGE-EVENT|INTERMEDIATE-THROW-MESSAGE-EVENT|INTERMEDIATE-CATCH-MESSAGE-EVENT|SCRIPT-TASK|START-TIMER-EVENT|INTERMEDIATE-CATCH-TIMER-EVENT|END-EMAIL-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT|SERVICE-TASK', 'Please set a valid value for TAS_TYPE'); $tMap->addValidator('TAS_TIMEUNIT', 'validValues', 'propel.validator.ValidValuesValidator', 'MINUTES|HOURS|DAYS|WEEKS|MONTHS', 'Please select a valid value for TAS_TIMEUNIT.'); diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 099191d69..9a3886cdd 100644 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -1333,7 +1333,7 @@ - + diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index 7e54c4e29..1872d7e25 100644 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -24283,6 +24283,12 @@ msgstr "New BPMN Project" msgid "The following case is a \"Script-Task\"" msgstr "The following case is a \"Script-Task\"" +# TRANSLATION +# LABEL/ID_ROUTE_TO_TASK_SERVICE_TASK +#: LABEL/ID_ROUTE_TO_TASK_SERVICE_TASK +msgid "The following case is a \"Service-Task\"" +msgstr "The following case is a \"Service-Task\"" + # TRANSLATION # LABEL/ID_MAFE_0d82790b0612935992bd564a17ce37d6 #: LABEL/ID_MAFE_0d82790b0612935992bd564a17ce37d6 diff --git a/workflow/engine/controllers/designer.php b/workflow/engine/controllers/designer.php index 62f2aa641..24d370c97 100644 --- a/workflow/engine/controllers/designer.php +++ b/workflow/engine/controllers/designer.php @@ -154,6 +154,26 @@ class Designer extends Controller } } + //plugin set source path + $sourceCss = array(); + $sourceJs = array(); + + $pluginRegistry = &PMPluginRegistry::getSingleton(); + $srcPath = $pluginRegistry->getDesignerSourcePath(); + + foreach ($srcPath as $key => $value) { + $ext = pathinfo($value->pathFile, PATHINFO_EXTENSION); + if ($ext === "css") { + $sourceCss[] = $value->pathFile; + } + if ($ext === "js") { + $sourceJs[] = $value->pathFile; + } + } + + $this->setVar('sourceCss', $sourceCss); + $this->setVar('sourceJs', $sourceJs); + $this->render(); } diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index b9ac61d2e..1d7483135 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -5580,6 +5580,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_NEW_PROJECT','en','New Project','2015-08-18') , ( 'LABEL','ID_NEW_BPMN_PROJECT','en','New BPMN Project','2015-08-18') , ( 'LABEL','ID_ROUTE_TO_TASK_SCRIPT_TASK','en','The following case is a "Script-Task"','2015-08-18') , +( 'LABEL','ID_ROUTE_TO_TASK_SERVICE_TASK','en','The following case is a "Service-Task"','2016-11-25') , ( 'LABEL','ID_MAFE_0d82790b0612935992bd564a17ce37d6','en','Quit','2016-08-12') , ( 'LABEL','ID_MAFE_16f49c0f891dce505db0ffe478aff96f','en','Next →','2016-08-12') , ( 'LABEL','ID_MAFE_064626e308f7d6587778df2924ea847c','en','← Back','2016-08-12') , diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index a1517ad8c..b1e6dc36d 100644 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -978,6 +978,9 @@ try { $optionTaskType = (isset($aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TYPE"]))? $aFields["TASK"][$sKey]["NEXT_TASK"]["TAS_TYPE"] : ""; switch ($optionTaskType) { + case "SERVICE-TASK": + $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_UID"] = G::LoadTranslation("ID_ROUTE_TO_TASK_SERVICE_TASK"); + break; case "SCRIPT-TASK": $aFields["TASK"][$sKey]["NEXT_TASK"]["USR_UID"] = G::LoadTranslation("ID_ROUTE_TO_TASK_SCRIPT_TASK"); break; diff --git a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php index 2928f50e9..dc5751410 100644 --- a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php @@ -205,9 +205,22 @@ class BpmnWorkflow extends Project\Bpmn $activityCurrent = \BpmnActivityPeer::retrieveByPK($actUid); - if ($activityCurrent->getActType() == "TASK" && $activityCurrent->getActTaskType() == "SCRIPTTASK") { - $taskData["TAS_TYPE"] = "SCRIPT-TASK"; - $taskData["TAS_ASSIGN_TYPE"] = "BALANCED"; + if ($activityCurrent->getActType() == "TASK") { + switch ($activityCurrent->getActTaskType()) { + case 'SCRIPTTASK': + $taskData["TAS_TYPE"] = "SCRIPT-TASK"; + $taskData["TAS_ASSIGN_TYPE"] = "BALANCED"; + break; + case 'SERVICETASK': + $registry = \PMPluginRegistry::getSingleton(); + $taskData["TAS_TYPE"] = "NORMAL"; + //The plugin pmConnectors will be moved to the core in pm.3.3 + if ($registry->getStatusPlugin('pmConnectors') === 'enabled') { + $taskData["TAS_TYPE"] = "SERVICE-TASK"; + $taskData["TAS_ASSIGN_TYPE"] = "BALANCED"; + } + break; + } } $this->wp->addTask($taskData); @@ -254,6 +267,8 @@ class BpmnWorkflow extends Project\Bpmn )); } + $taskData = self::__updateServiceTask($activityBefore, $activityCurrent, $taskData); + if($activityCurrent->getActLoopType() == "PARALLEL"){ $task = \TaskPeer::retrieveByPK($actUid); if($task->getTasAssignType() == "BALANCED" || $task->getTasAssignType() == "MANUAL" || $task->getTasAssignType() == "EVALUATE" || $task->getTasAssignType() == "REPORT_TO" || $task->getTasAssignType() == "SELF_SERVICE"){ @@ -271,6 +286,62 @@ class BpmnWorkflow extends Project\Bpmn $this->wp->updateTask($actUid, $taskData); } + /** + * @param $actUid + * @param $data + */ + public function sincronizeActivityData($actUid, $data) + { + $registry = \PMPluginRegistry::getSingleton(); + $taskData = \TaskPeer::retrieveByPK($actUid); + //The plugin pmConnectors will be moved to the core in pm.3.3 + if ($taskData->getTasType() == 'SERVICE-TASK' && $registry->getStatusPlugin('pmConnectors') !== 'enabled') { + $taskData = array(); + $taskData["TAS_TYPE"] = "NORMAL"; + $taskData["TAS_ASSIGN_TYPE"] = "BALANCED"; + $this->wp->updateTask($actUid, $taskData); + } + } + + /** + * @param null $activityBefore + * @param null $activityCurrent + * @param $taskData + * @return mixed + */ + static function __updateServiceTask($activityBefore, $activityCurrent, $taskData) + { + $registry = \PMPluginRegistry::getSingleton(); + if ($activityBefore->getActTaskType() != "SERVICETASK" && $activityCurrent->getActTaskType() == "SERVICETASK") { + //The plugin pmConnectors will be moved to the core in pm.3.3 + if ($registry->getStatusPlugin('pmConnectors') === 'enabled') { + $taskData["TAS_TYPE"] = "SERVICE-TASK"; + $taskData["TAS_ASSIGN_TYPE"] = "BALANCED"; + } else { + $taskData["TAS_TYPE"] = "NORMAL"; + $taskData["TAS_ASSIGN_TYPE"] = "BALANCED"; + } + } + + if ($activityBefore->getActTaskType() == "SERVICETASK" && $activityCurrent->getActTaskType() != "SERVICETASK") { + $taskData["TAS_TYPE"] = "NORMAL"; + $taskData["TAS_ASSIGN_TYPE"] = "BALANCED"; + if($activityCurrent->getActTaskType() == "SCRIPTTASK"){ + $taskData["TAS_TYPE"] = "SCRIPT-TASK"; + } + //The plugin pmConnectors will be moved to the core in pm.3.3 + if ($registry->getStatusPlugin('pmConnectors') === 'enabled') { + $pathFile = PATH_PLUGINS . 'pmConnectors' . PATH_SEP . 'src' . PATH_SEP . 'Services' . PATH_SEP . 'BusinessModel' . PATH_SEP . 'PmConnectors' . PATH_SEP . 'ServiceTaskBM.php'; + if (is_file($pathFile)) { + require_once $pathFile; + $serviceTask = new \Services\BusinessModel\PmConnectors\ServiceTaskBM(); + $serviceTask->deleteByActivityUid($activityCurrent->getPrjUid(), $activityCurrent->getActUid()); + } + } + } + return $taskData; + } + public function removeActivity($actUid) { $activity = \BpmnActivityPeer::retrieveByPK($actUid); @@ -1530,7 +1601,6 @@ class BpmnWorkflow extends Project\Bpmn $activityData = Util\ArrayUtil::boolToIntValues($activityData); $activity = $bwp->getActivity($activityData["ACT_UID"]); - if ($forceInsert || is_null($activity)) { if ($generateUid) { //Generate and update UID @@ -1552,7 +1622,7 @@ class BpmnWorkflow extends Project\Bpmn } else { Util\Logger::log("Update Activity ({$activityData["ACT_UID"]}) Skipped - No changes required"); } - + $bwp->sincronizeActivityData($activityData["ACT_UID"], $activityData); $diagram["activities"][$i] = $activityData; $whiteList[] = $activityData["ACT_UID"]; diff --git a/workflow/engine/src/ProcessMaker/Project/Workflow.php b/workflow/engine/src/ProcessMaker/Project/Workflow.php index 277dd329f..9c98e058d 100644 --- a/workflow/engine/src/ProcessMaker/Project/Workflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Workflow.php @@ -230,6 +230,19 @@ class Workflow extends Handler $this->removeSupProcess($this->proUid, $tasUid); } + if ($tasType == "SERVICE-TASK") { + $registry = \PMPluginRegistry::getSingleton(); + //The plugin pmConnectors will be moved to the core in pm.3.3 + if ($registry->getStatusPlugin('pmConnectors') === 'enabled') { + $pathFile = PATH_PLUGINS . 'pmConnectors' . PATH_SEP . 'src' . PATH_SEP . 'Services' . PATH_SEP . 'BusinessModel' . PATH_SEP . 'PmConnectors' . PATH_SEP . 'ServiceTaskBM.php'; + if (is_file($pathFile)) { + require_once $pathFile; + $serviceTask = new \Services\BusinessModel\PmConnectors\ServiceTaskBM(); + $serviceTask->deleteByActivityUid($this->proUid, $tasUid); + } + } + } + } catch (\Exception $e) { self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString()); throw $e; diff --git a/workflow/engine/templates/cases/cases_ScreenDerivation.html b/workflow/engine/templates/cases/cases_ScreenDerivation.html index b4f5a96ff..d744e6ae4 100644 --- a/workflow/engine/templates/cases/cases_ScreenDerivation.html +++ b/workflow/engine/templates/cases/cases_ScreenDerivation.html @@ -98,6 +98,11 @@ {$data.NEXT_TASK.USR_UID}{$data.NEXT_TASK.USR_HIDDEN_FIELD} + {elseif ($data.NEXT_TASK.TAS_TYPE == "SERVICE-TASK")} + + + {$data.NEXT_TASK.USR_UID}{$data.NEXT_TASK.USR_HIDDEN_FIELD} + {elseif ($data.NEXT_TASK.TAS_TYPE == "INTERMEDIATE-CATCH-TIMER-EVENT")} {$NEXT_TASK_LABEL}: diff --git a/workflow/engine/templates/designer/index.html b/workflow/engine/templates/designer/index.html index e20bf7763..a40df5785 100644 --- a/workflow/engine/templates/designer/index.html +++ b/workflow/engine/templates/designer/index.html @@ -71,6 +71,9 @@ + {foreach from=$sourceCss item=pathFile} + + {/foreach} + {foreach from=$sourceJs item=pathFile} + + {/foreach} {/if}