From 5943d098f464967d7fd3fd9f070cc8010b9a3b7d Mon Sep 17 00:00:00 2001 From: Brayan Osmar Pereyra Suxo Date: Mon, 24 Feb 2014 15:13:31 -0400 Subject: [PATCH 1/8] Adicion para setear position de step al crearlo --- workflow/engine/src/BusinessModel/Step.php | 29 ++++++++++++---------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/workflow/engine/src/BusinessModel/Step.php b/workflow/engine/src/BusinessModel/Step.php index c7e7623ba..1261c8379 100644 --- a/workflow/engine/src/BusinessModel/Step.php +++ b/workflow/engine/src/BusinessModel/Step.php @@ -321,17 +321,17 @@ class Step throw (new \Exception(str_replace(array("{0}", "{1}"), array($taskUid . ", " . $arrayData["STEP_TYPE_OBJ"] . ", " . $arrayData["STEP_UID_OBJ"], "STEP"), "The record \"{0}\", exists in table {1}"))); } - if (isset($arrayData["STEP_POSITION"]) && $this->existsRecord($taskUid, "", "", $arrayData["STEP_POSITION"])) { - throw (new \Exception(str_replace(array("{0}", "{1}", "{2}"), array($arrayData["STEP_POSITION"], $taskUid . ", " . $arrayData["STEP_POSITION"], "STEP"), "The \"{0}\" position for the record \"{1}\", exists in table {2}"))); - } - //Create $step = new \Step(); - $stepUid = $step->create(array("PRO_UID" => $processUid, "TAS_UID" => $taskUid)); + $stepUid = $step->create(array( + "PRO_UID" => $processUid, + "TAS_UID" => $taskUid, + "STEP_POSITION" => $step->getNextPosition($taskUid) + )); if (!isset($arrayData["STEP_POSITION"]) || $arrayData["STEP_POSITION"] == "") { - $arrayData["STEP_POSITION"] = $step->getNextPosition($taskUid) - 1; + unset($arrayData["STEP_POSITION"]); } $arrayData = $this->update($stepUid, $arrayData); @@ -369,7 +369,6 @@ class Step //Load Step $step = new \Step(); - $arrayStepData = $step->load($stepUid); $taskUid = $arrayStepData["TAS_UID"]; @@ -428,19 +427,21 @@ class Step } } - if (isset($arrayData["STEP_POSITION"]) && ($arrayData["STEP_POSITION"] != $arrayStepData["STEP_POSITION"])) { - $this->moveSteps($proUid, $taskUid, $stepUid, $arrayData["STEP_POSITION"]); - } - //Update $step = new \Step(); $arrayData["STEP_UID"] = $stepUid; - + $tempPosition = (isset($arrayData["STEP_POSITION"])) ? $arrayData["STEP_POSITION"] : $arrayStepData["STEP_POSITION"]; + $arrayData["STEP_POSITION"] = $arrayStepData["STEP_POSITION"]; $result = $step->update($arrayData); + if (isset($tempPosition) && ($tempPosition != $arrayStepData["STEP_POSITION"])) { + $this->moveSteps($proUid, $taskUid, $stepUid, $tempPosition); + } + //Return unset($arrayData["STEP_UID"]); + $arrayData["STEP_POSITION"] = $tempPosition; if (!$this->formatFieldNameInUppercase) { $arrayData = array_change_key_case($arrayData, CASE_LOWER); @@ -875,7 +876,9 @@ class Step $seStepPos = $step_pos; //Principal Step is up - if ($prStepPos < $seStepPos) { + if ($prStepPos == $seStepPos) { + return true; + } elseif ($prStepPos < $seStepPos) { $modPos = 'UP'; $newPos = $seStepPos; $iniPos = $prStepPos+1; From 7898045cf2c6c8772821c98ce00d9e4773c1d05e Mon Sep 17 00:00:00 2001 From: Freddy Daniel Rojas Valda Date: Mon, 24 Feb 2014 16:54:55 -0400 Subject: [PATCH 2/8] Se mejora FILESMANAGER. Se adiciona en el GET el content del documento y se agregan validaciones. --- .../engine/src/BusinessModel/FilesManager.php | 40 +++++++++++++------ .../Api/ProcessMaker/Project/FilesManager.php | 12 ++---- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/workflow/engine/src/BusinessModel/FilesManager.php b/workflow/engine/src/BusinessModel/FilesManager.php index 53d74a198..f6fa3c22b 100644 --- a/workflow/engine/src/BusinessModel/FilesManager.php +++ b/workflow/engine/src/BusinessModel/FilesManager.php @@ -82,17 +82,25 @@ class FilesManager } foreach ($aFiles as $aFile) { $arrayFileUid = $this->getFileManagerUid($sDirectory.$aFile['FILE']); + $fcontent = file_get_contents($sDirectory.$aFile['FILE']); $fileUid = $arrayFileUid["PRF_UID"]; if ($fileUid) { $oProcessFiles = \ProcessFilesPeer::retrieveByPK($fileUid); + $editable = $oProcessFiles->getPrfEditable(); + if ($editable == 1){ + $editable = 'true'; + } else { + $editable = 'false'; + } $aTheFiles[] = array( 'prf_filename' => $aFile['FILE'], 'usr_uid' => $oProcessFiles->getUsrUid(), 'prf_update_usr_uid' => $oProcessFiles->getPrfUpdateUsrUid(), 'prf_path' => $sMainDirectory. PATH_SEP .$sSubDirectory, 'prf_type' => $oProcessFiles->getPrfType(), - 'prf_editable' => $oProcessFiles->getPrfEditable(), + 'prf_editable' => $editable, 'prf_create_date' => $oProcessFiles->getPrfCreateDate(), - 'prf_update_date' => $oProcessFiles->getPrfUpdateDate()); + 'prf_update_date' => $oProcessFiles->getPrfUpdateDate(), + 'prf_content' => $fcontent); } else { $aTheFiles[] = array('prf_filename' => $aFile['FILE'], @@ -100,9 +108,10 @@ class FilesManager 'prf_update_usr_uid' => '', 'prf_path' => $sMainDirectory. PATH_SEP .$sSubDirectory, 'prf_type' => 'file', - 'prf_editable' => '', + 'prf_editable' => $editable, 'prf_create_date' => '', - 'prf_update_date' => ''); + 'prf_update_date' => '', + 'prf_content' => $fcontent); } } @@ -127,6 +136,9 @@ class FilesManager { try { $aData['prf_path'] = rtrim($aData['prf_path'], '/') . '/'; + if (!$aData['prf_filename']){ + throw (new \Exception( 'invalid value specified for `prf_filename`.')); + } $sMainDirectory = current(explode("/", $aData['prf_path'])); if ($sMainDirectory != 'public' && $sMainDirectory != 'templates') { throw (new \Exception( 'invalid value specified for `prf_path`. Expecting `templates/` or `public/`')); @@ -184,7 +196,8 @@ class FilesManager 'prf_type' => $oProcessFiles->getPrfType(), 'prf_editable' => $oProcessFiles->getPrfEditable(), 'prf_create_date' => $oProcessFiles->getPrfCreateDate(), - 'prf_update_date' => $oProcessFiles->getPrfUpdateDate()); + 'prf_update_date' => $oProcessFiles->getPrfUpdateDate(), + 'prf_content' => $content); return $oProcessFile; } catch (Exception $e) { throw $e; @@ -195,15 +208,14 @@ class FilesManager * Return the Process Files Manager * * @param string $prjUid {@min 32} {@max 32} - * @param array $aData + * @param string $prfUid {@min 32} {@max 32} * * * @access public */ - public function uploadProcessFilesManager($prjUid, $aData) + public function uploadProcessFilesManager($prjUid, $prfUid) { try { - $prfUid = $aData['prf_uid']; $path = ''; $criteria = new \Criteria("workflow"); $criteria->addSelectColumn(\ProcessFilesPeer::PRF_PATH); @@ -220,10 +232,14 @@ class FilesManager } $file = end(explode("/",$path)); $path = str_replace($file,'',$path); - if ($_FILES['my_file']['error'] != 1) { - if ($_FILES['my_file']['tmp_name'] != '') { - \G::uploadFile($_FILES['my_file']['tmp_name'],$path , $_FILES['my_file']['name']); - } + if ($file == $_FILES['prf_file']['name']) { + if ($_FILES['prf_file']['error'] != 1) { + if ($_FILES['prf_file']['tmp_name'] != '') { + \G::uploadFile($_FILES['prf_file']['tmp_name'],$path , $_FILES['prf_file']['name']); + } + } + } else { + throw new \Exception(\G::LoadTranslation('ID_PMTABLE_UPLOADING_FILE_PROBLEM')); } } catch (Exception $e) { throw $e; diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project/FilesManager.php b/workflow/engine/src/Services/Api/ProcessMaker/Project/FilesManager.php index 1ea3d6109..ce9e674ea 100644 --- a/workflow/engine/src/Services/Api/ProcessMaker/Project/FilesManager.php +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project/FilesManager.php @@ -46,7 +46,6 @@ class FilesManager extends Api try { $userUid = $this->getUserId(); $request_data = (array)($request_data); - $filesManager = new \BusinessModel\FilesManager(); $arrayData = $filesManager->addProcessFilesManager($prjUid, $userUid, $request_data); //Response @@ -60,15 +59,15 @@ class FilesManager extends Api /** * @param string $prjUid {@min 32} {@max 32} - * @param array $request_data + * @param string $prfUid {@min 32} {@max 32} * - * @url POST /:prjUid/file-manager/upload + * @url POST /:prjUid/file-manager/:prfUid/upload */ - public function doPostProcessFilesManagerUpload($prjUid, $request_data) + public function doPostProcessFilesManagerUpload($prjUid, $prfUid) { try { $filesManager = new \BusinessModel\FilesManager(); - $filesManager->uploadProcessFilesManager($prjUid, $request_data); + $filesManager->uploadProcessFilesManager($prjUid, $prfUid); } catch (\Exception $e) { //response throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); @@ -145,9 +144,6 @@ class ProcessFilesManagerStructure */ public $prf_path; - /** - * @var string {@from body} - */ public $prf_content; } From df917d4d6655e18829b6d62e671430e58553d088 Mon Sep 17 00:00:00 2001 From: Brayan Osmar Pereyra Suxo Date: Mon, 24 Feb 2014 17:01:36 -0400 Subject: [PATCH 3/8] Adicion para el ordenamiento en el PUT para STEP_TRIGGERS --- .../engine/src/BusinessModel/Step/Trigger.php | 90 +++++++++++++++++-- 1 file changed, 85 insertions(+), 5 deletions(-) diff --git a/workflow/engine/src/BusinessModel/Step/Trigger.php b/workflow/engine/src/BusinessModel/Step/Trigger.php index ac96d71d3..673dae55a 100644 --- a/workflow/engine/src/BusinessModel/Step/Trigger.php +++ b/workflow/engine/src/BusinessModel/Step/Trigger.php @@ -1,6 +1,8 @@ existsRecord($stepUid, $type, $taskUid, "", $arrayData["st_position"], $triggerUid)) { - throw (new \Exception(str_replace(array("{0}", "{1}", "{2}"), array($arrayData["st_position"], $stepUid . ", " . $type . ", " . $taskUid . ", " . $arrayData["st_position"], "STEP_TRIGGER"), "The \"{0}\" position for the record \"{1}\", exists in table {2}"))); - } - //Update $stepTrigger = new \StepTrigger(); @@ -203,10 +201,13 @@ class Trigger } if (isset($arrayData["st_position"]) && $arrayData["st_position"] != "") { - $arrayUpdateData["ST_POSITION"] = (int)($arrayData["st_position"]); + $tempPos = (int)($arrayData["st_position"]); } $stepTrigger->update($arrayUpdateData); + if (isset($tempPos)) { + $this->moveStepTriggers($taskUid, $stepUid, $triggerUid, $type, $tempPos); + } return array_change_key_case($arrayUpdateData, CASE_LOWER); } catch (\Exception $e) { @@ -360,5 +361,84 @@ class Trigger throw $e; } } + + /** + * Validate Process Uid + * @var string $pro_uid. Uid for Process + * @var string $tas_uid. Uid for Task + * @var string $step_uid. Uid for Step + * @var string $step_pos. Position for Step + * + * @author Brayan Pereyra (Cochalo) + * @copyright Colosa - Bolivia + * + * @return void + */ + public function moveStepTriggers($tasUid, $stepUid, $triUid, $type, $newPos) { + $stepTrigger = new \BusinessModel\Step(); + $aStepTriggers = $stepTrigger->getTriggers($stepUid, $tasUid); + foreach ($aStepTriggers as $dataStep) { + if (($dataStep['st_type'] == $type) && ($dataStep['tri_uid'] == $triUid)) { + $prStepPos = (int)$dataStep['st_position']; + } + } + $seStepPos = $newPos; + + //Principal Step is up + if ($prStepPos == $seStepPos) { + return true; + } elseif ($prStepPos < $seStepPos) { + $modPos = 'UP'; + $newPos = $seStepPos; + $iniPos = $prStepPos+1; + $finPos = $seStepPos; + } else { + $modPos = 'DOWN'; + $newPos = $seStepPos; + $iniPos = $seStepPos; + $finPos = $prStepPos-1; + } + + $range = range($iniPos, $finPos); + foreach ($aStepTriggers as $dataStep) { + if (($dataStep['st_type'] == $type) && (in_array($dataStep['st_position'], $range)) && ($dataStep['tri_uid'] != $triUid)) { + $stepChangeIds[] = $dataStep['tri_uid']; + $stepChangePos[] = $dataStep['st_position']; + } + } + + foreach ($stepChangeIds as $key => $value) { + if ($modPos == 'UP') { + $tempPos = ((int)$stepChangePos[$key])-1; + $this->changePosStep($stepUid, $tasUid, $value, $type, $tempPos); + } else { + $tempPos = ((int)$stepChangePos[$key])+1; + $this->changePosStep($stepUid, $tasUid, $value, $type, $tempPos); + } + } + $this->changePosStep($stepUid, $tasUid, $triUid, $type, $newPos); + } + + /** + * Validate Process Uid + * @var string $pro_uid. Uid for process + * + * @author Brayan Pereyra (Cochalo) + * @copyright Colosa - Bolivia + * + * @return string + */ + public function changePosStep ($stepUid, $tasUid, $triUid, $type, $pos) + { + $data = array( + 'STEP_UID' => $stepUid, + 'TAS_UID' => $tasUid, + 'TRI_UID' => $triUid, + 'ST_TYPE' => $type, + 'ST_POSITION' => $pos + ); + $StepTrigger = new \StepTrigger(); + $StepTrigger->update($data); + } } From 7962d40a0fc2fc89b18ff9b381dfcf057c978748 Mon Sep 17 00:00:00 2001 From: Erik Amaru Ortiz Date: Mon, 24 Feb 2014 19:10:45 -0400 Subject: [PATCH 4/8] Updating Unit Tests for BpmnWorkflow Adapter, and some Bpmn->Workflow logic --- workflow/engine/classes/model/BpmnEvent.php | 12 +- workflow/engine/classes/model/BpmnFlow.php | 47 ++- workflow/engine/classes/model/BpmnGateway.php | 17 +- workflow/engine/classes/model/Route.php | 20 ++ .../Project/Adapter/BpmnWorkflow.php | 219 ++++++++----- .../engine/src/ProcessMaker/Project/Bpmn.php | 39 ++- .../src/ProcessMaker/Project/Workflow.php | 23 ++ .../engine/src/ProcessMaker/Util/Logger.php | 6 +- .../src/Services/Api/ProcessMaker/Project.php | 6 +- .../Project/Adapter/BpmnWorkflowTest.php | 298 +++++++++++++++++- 10 files changed, 589 insertions(+), 98 deletions(-) diff --git a/workflow/engine/classes/model/BpmnEvent.php b/workflow/engine/classes/model/BpmnEvent.php index e4c4a8c06..9a1446b03 100644 --- a/workflow/engine/classes/model/BpmnEvent.php +++ b/workflow/engine/classes/model/BpmnEvent.php @@ -85,9 +85,9 @@ class BpmnEvent extends BaseBpmnEvent // OVERRIDES - public function setActUid($actUid) + public function setActUid($evnUid) { - parent::setActUid($actUid); + parent::setEvnUid($evnUid); $this->bound->setElementUid($this->getEvnUid()); } @@ -165,4 +165,12 @@ class BpmnEvent extends BaseBpmnEvent return $data; } + + public static function exists($evnUid) + { + $c = new Criteria("workflow"); + $c->add(BpmnEventPeer::EVN_UID, $evnUid); + + return BpmnEventPeer::doCount($c) > 0 ? true : false; + } } // BpmnEvent diff --git a/workflow/engine/classes/model/BpmnFlow.php b/workflow/engine/classes/model/BpmnFlow.php index b6e1ca984..6d800f692 100644 --- a/workflow/engine/classes/model/BpmnFlow.php +++ b/workflow/engine/classes/model/BpmnFlow.php @@ -21,17 +21,27 @@ class BpmnFlow extends BaseBpmnFlow * @param $value string * @return \BpmnFlow|null */ - public static function findOneBy($field, $value) + public static function findOneBy($field, $value = null) { $rows = self::findAllBy($field, $value); return empty($rows) ? null : $rows[0]; } - public static function findAllBy($field, $value) + /** + * @param $field + * @param null $value + * @return \BpmnFlow[] + */ + public static function findAllBy($field, $value = null) { + $field = is_array($field) ? $field : array($field => $value); + $c = new Criteria('workflow'); - $c->add($field, $value, Criteria::EQUAL); + + foreach ($field as $key => $value) { + $c->add($key, $value, Criteria::EQUAL); + } return BpmnFlowPeer::doSelect($c); } @@ -83,4 +93,35 @@ class BpmnFlow extends BaseBpmnFlow return $flow; } + /*public static function select($select, $where = array()) + { + $data = array(); + + $c = new Criteria('workflow'); + if ($select !== '*') { + if (is_array($select)) { + foreach ($select as $column) { + $c->addSelectColumn($column); + } + } else { + $c->addSelectColumn($select); + } + } + + if (! empty($where)) { + foreach ($where as $column => $value) { + $c->add($column, $value); + } + } + + $rs = BpmnFlowPeer::doSelectRS($c); + $rs->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + while ($rs->next()) { + $data[] = $rs->getRow(); + } + + return $data; + }*/ + } // BpmnFlow diff --git a/workflow/engine/classes/model/BpmnGateway.php b/workflow/engine/classes/model/BpmnGateway.php index 107c16f64..5a5be2835 100644 --- a/workflow/engine/classes/model/BpmnGateway.php +++ b/workflow/engine/classes/model/BpmnGateway.php @@ -45,6 +45,11 @@ class BpmnGateway extends BaseBpmnGateway } } + /** + * @param $field + * @param $value + * @return \BpmnGateway|null + */ public static function findOneBy($field, $value) { $rows = self::findAllBy($field, $value); @@ -87,8 +92,8 @@ class BpmnGateway extends BaseBpmnGateway public function setActUid($actUid) { - parent::setActUid($actUid); - $this->bound->setElementUid($this->getActUid()); + parent::setGatUid($actUid); + $this->bound->setElementUid($this->getGatUid()); } public function setPrjUid($prjUid) @@ -166,4 +171,12 @@ class BpmnGateway extends BaseBpmnGateway return $data; } + public static function exists($gatUid) + { + $c = new Criteria("workflow"); + $c->add(BpmnGatewayPeer::GAT_UID, $gatUid); + + return BpmnGatewayPeer::doCount($c) > 0 ? true : false; + } + } // BpmnGateway diff --git a/workflow/engine/classes/model/Route.php b/workflow/engine/classes/model/Route.php index ecafc14c0..b0a0d1e12 100755 --- a/workflow/engine/classes/model/Route.php +++ b/workflow/engine/classes/model/Route.php @@ -238,5 +238,25 @@ class Route extends BaseRoute return RoutePeer::doSelect($c); } + + public static function getAll($proUid = null, $start = null, $limit = null, $filter = '', $changeCaseTo = CASE_UPPER) + { + $c = new Criteria('workflow'); + $c->addSelectColumn("ROUTE.*"); + + if (! is_null($proUid)) { + $c->add(RoutePeer::PRO_UID, $proUid, Criteria::EQUAL); + } + + $rs = RoutePeer::doSelectRS($c); + $rs->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + $routes = array(); + while ($rs->next()) { + $routes[] = $changeCaseTo !== CASE_UPPER ? array_change_key_case($rs->getRow(), CASE_LOWER) : $rs->getRow(); + } + + return $routes; + } } diff --git a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php index 1e44b5732..7ec39c752 100644 --- a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php @@ -3,6 +3,7 @@ namespace ProcessMaker\Project\Adapter; use ProcessMaker\Project; use ProcessMaker\Util\Hash; +use Symfony\Component\DependencyInjection\Exception\LogicException; /** * Class BpmnWorkflow @@ -105,7 +106,8 @@ class BpmnWorkflow extends Project\Bpmn { $taskData = array(); - $taskData["TAS_UID"] = parent::addActivity($data); + $actUid = parent::addActivity($data); + $taskData["TAS_UID"] = $actUid; if (array_key_exists("ACT_NAME", $data)) { $taskData["TAS_TITLE"] = $data["ACT_NAME"]; @@ -118,6 +120,8 @@ class BpmnWorkflow extends Project\Bpmn } $this->wp->addTask($taskData); + + return $actUid; } public function updateActivity($actUid, $data) @@ -145,55 +149,47 @@ class BpmnWorkflow extends Project\Bpmn $this->wp->removeTask($actUid); } - public function addFlow($data, $diagram) - { - $flows = $diagram["flows"]; - $gateways = $diagram["gateways"]; - $events = $diagram["events"]; - - parent::addFlow($data); +// public function addFlow($data) +// { +// parent::addFlow($data); // to add a workflow route // - activity -> activity ==> route // - activity -> gateway -> activity ==> selection, evaluation, parallel or parallel by evaluation route - $routes = self::mapBpmnFlowsToWorkflowRoute($data, $flows, $gateways, $events); +// $routes = self::mapBpmnFlowsToWorkflowRoute($data, $flows); +// +// if ($routes !== null) { +// foreach ($routes as $routeData) { +// $this->wp->addRoute($routeData["from"], $routeData["to"], $routeData["type"]); +// } +// +// return true; +// } +// +// // to add start event->activity as initial or end task +// switch ($data["FLO_ELEMENT_ORIGIN_TYPE"]) { +// case "bpmnEvent": +// switch ($data["FLO_ELEMENT_DEST_TYPE"]) { +// case "bpmnActivity": +// $event = \BpmnEventPeer::retrieveByPK($data["FLO_ELEMENT_ORIGIN"]); +// +// switch ($event && $event->getEvnType()) { +// case "START": +// // then set that activity/task as "Start Task" +// $this->wp->setStartTask($data["FLO_ELEMENT_DEST"]); +// break; +// } +// break; +// } +// break; +// } - if ($routes !== null) { - foreach ($routes as $routeData) { - $this->wp->addRoute($routeData["from"], $routeData["to"], $routeData["type"]); - } +// } - return true; - } - - // to add start event->activity as initial or end task - switch ($data["FLO_ELEMENT_ORIGIN_TYPE"]) { - case "bpmnEvent": - switch ($data["FLO_ELEMENT_DEST_TYPE"]) { - case "bpmnActivity": - $event = \BpmnEventPeer::retrieveByPK($data["FLO_ELEMENT_ORIGIN"]); - - switch ($event && $event->getEvnType()) { - case "START": - // then set that activity/task as "Start Task" - $this->wp->setStartTask($data["FLO_ELEMENT_DEST"]); - break; - } - break; - } - break; - } - } - - public function updateFlow($floUid, $data) - { - if (! self::isModified("flow", $floUid, $data)) { - self::log("Update Flow: $floUid (No Changes)"); - return false; - } - - parent::updateFlow($floUid, $data); - } +// public function updateFlow($floUid, $data, $flows) +// { +// parent::updateFlow($floUid, $data); +// } public function removeFlow($floUid) { @@ -224,7 +220,20 @@ class BpmnWorkflow extends Project\Bpmn $this->wp->setEndTask($activity->getActUid(), false); } } + } else { + switch ($flow->getFloElementOriginType()) { + case "bpmnActivity": + switch ($flow->getFloElementDestType()) { + // activity->activity + case "bpmnActivity": + $this->wp->removeRouteFromTo($flow->getFloElementOrigin(), $flow->getFloElementDest()); + break; + } + break; + } } + + // TODO Complete for other routes, activity->activity, activity->gateway and viceversa } public function addEvent($data) @@ -236,35 +245,102 @@ class BpmnWorkflow extends Project\Bpmn parent::addEvent($data); } - public function removeEvent($evnUid) + public function mapBpmnFlowsToWorkflowRoutes() { -// $event = \BpmnEventPeer::retrieveByPK($evnUid); -// -// switch ($event->getEvnType()) { -// case "START": -// $flow = \BpmnFlow::findOneBy(\BpmnFlowPeer::FLO_ELEMENT_ORIGIN, $event->getEvnUid()); -// if (! is_null($flow) && $flow->getFloElementDestType() == "bpmnActivity") { -// $activity = \BpmnActivityPeer::retrieveByPK($flow->getFloElementDest()); -// if (! is_null($activity)) { -// $this->wp->setStartTask($activity->getActUid(), false); -// } -// } -// break; -// case "END": -// $flow = \BpmnFlow::findOneBy(\BpmnFlowPeer::FLO_ELEMENT_DEST, $event->getEvnUid()); -// if (! is_null($flow) && $flow->getFloElementOriginType() == "bpmnActivity") { -// $activity = \BpmnActivityPeer::retrieveByPK($flow->getFloElementOrigin()); -// if (! is_null($activity)) { -// $this->wp->setEndTask($activity->getActUid(), false); -// } -// } -// break; -// } + $activities = $this->getActivities(); - parent::removeEvent($evnUid); + foreach ($activities as $activity) { + + $flows = \BpmnFlow::findAllBy(array( + \BpmnFlowPeer::FLO_ELEMENT_ORIGIN => $activity["ACT_UID"], + \BpmnFlowPeer::FLO_ELEMENT_ORIGIN_TYPE => "bpmnActivity" + )); + + // + foreach ($flows as $flow) { + switch ($flow->getFloElementDestType()) { + case "bpmnActivity": + // (activity -> activity) + $this->wp->addRoute($activity["ACT_UID"], $flow->getFloElementDest(), "SEQUENTIAL"); + break; + + case "bpmnGateway": + // (activity -> gateway) + // we must find the related flows: gateway -> + $gatUid = $flow->getFloElementDest(); + $gatewayFlows = \BpmnFlow::findAllBy(array( + \BpmnFlowPeer::FLO_ELEMENT_ORIGIN => $gatUid, + \BpmnFlowPeer::FLO_ELEMENT_ORIGIN_TYPE => "bpmnGateway" + )); + + foreach ($gatewayFlows as $gatewayFlow) { + $gatewayFlow = $gatewayFlow->toArray(); + + switch ($gatewayFlow['FLO_ELEMENT_DEST_TYPE']) { + case 'bpmnActivity': + // (gateway -> activity) + $gateway = \BpmnGateway::findOneBy(\BpmnGatewayPeer::GAT_UID, $gatUid)->toArray(); + + switch ($gateway["GAT_TYPE"]) { + //case 'SELECTION': + case self::BPMN_GATEWAY_COMPLEX: + $routeType = "SELECT"; + break; + //case 'EVALUATION': + case self::BPMN_GATEWAY_EXCLUSIVE: + $routeType = "EVALUATE"; + break; + //case 'PARALLEL': + case self::BPMN_GATEWAY_PARALLEL: + if ($gateway["GAT_DIRECTION"] == "DIVERGING") { + $routeType = "PARALLEL"; + } elseif ($gateway["GAT_DIRECTION"] == "CONVERGING") { + $routeType = "SEC-JOIN"; + } else { + throw new \LogicException(sprintf( + "Invalid Gateway direction, accepted values: [%s|%s], given: %s.", + "DIVERGING", "CONVERGING", $gateway["GAT_DIRECTION"] + )); + } + break; + //case 'PARALLEL_EVALUATION': + case self::BPMN_GATEWAY_INCLUSIVE: + if ($gateway["GAT_DIRECTION"] == "DIVERGING") { + $routeType = "PARALLEL-BY-EVALUATION"; + } elseif ($gateway["GAT_DIRECTION"] == "CONVERGING") { + $routeType = "SEC-JOIN"; + } else { + throw new \LogicException(sprintf( + "Invalid Gateway direction, accepted values: [%s|%s], given: %s.", + "DIVERGING", "CONVERGING", $gateway["GAT_DIRECTION"] + )); + } + break; +// case 'PARALLEL_JOIN': +// $routeType = 'SEC-JOIN'; +// break; + default: + throw new \LogicException(sprintf("Unsupported Gateway type: %s", $gateway['GAT_TYPE'])); + } + + $this->wp->addRoute($activity["ACT_UID"], $gatewayFlow['FLO_ELEMENT_DEST'], $routeType); + break; + default: + // for processmaker is only allowed flows between "gateway -> activity" + // any another flow is considered invalid + throw new \LogicException(sprintf( + "For ProcessMaker is only allowed flows between \"gateway -> activity\" " . PHP_EOL . + "Given: bpmnGateway -> " . $gatewayFlow['FLO_ELEMENT_DEST_TYPE'] + )); + } + } + break; + } + } + } } - public static function mapBpmnFlowsToWorkflowRoute($flow, $flows, $gateways, $events) + public static function mapBpmnFlowsToWorkflowRoute2($flow, $flows, $gateways, $events) { $fromUid = $flow['FLO_ELEMENT_ORIGIN']; $result = array(); @@ -387,11 +463,6 @@ class BpmnWorkflow extends Project\Bpmn return $result; } -// public function getActivities() -// { -// return parent::getActivities(); -// } - public function remove() { parent::remove(); diff --git a/workflow/engine/src/ProcessMaker/Project/Bpmn.php b/workflow/engine/src/ProcessMaker/Project/Bpmn.php index 262e6dcab..a19110254 100644 --- a/workflow/engine/src/ProcessMaker/Project/Bpmn.php +++ b/workflow/engine/src/ProcessMaker/Project/Bpmn.php @@ -325,6 +325,7 @@ class Bpmn extends Handler $activity = ActivityPeer::retrieveByPK($actUid); $activity->delete(); + //TODO if the activity was removed, the related flows to that activity must be removed self::log("Remove Activity Success!"); } catch (\Exception $e) { @@ -438,7 +439,6 @@ class Bpmn extends Handler $gateway->setPrjUid($this->getUid()); $gateway->setProUid($this->getProcess("object")->getProUid()); $gateway->save(); - self::log("Add Gateway Success!"); } catch (\Exception $e) { self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString()); @@ -518,13 +518,48 @@ class Bpmn extends Handler } try { + switch ($data["FLO_ELEMENT_ORIGIN_TYPE"]) { + case "bpmnActivity": $class = "BpmnActivity"; break; + case "bpmnGateway": $class = "BpmnGateway"; break; + case "bpmnEvent": $class = "BpmnEvent"; break; + default: + throw new \RuntimeException(sprintf("Invalid Object type, accepted types: [%s|%s|%s], given %s.", + "BpmnActivity", "BpmnBpmnGateway", "BpmnEvent", $data["FLO_ELEMENT_ORIGIN_TYPE"] + )); + } + + // Validate origin object exists + if (! $class::exists($data["FLO_ELEMENT_ORIGIN"])) { + throw new \RuntimeException(sprintf("Reference not found, the %s with UID: %s, does not exist!", + ucfirst($data["FLO_ELEMENT_ORIGIN_TYPE"]), $data["FLO_ELEMENT_ORIGIN"] + )); + } + + switch ($data["FLO_ELEMENT_DEST_TYPE"]) { + case "bpmnActivity": $class = "BpmnActivity"; break; + case "bpmnGateway": $class = "BpmnGateway"; break; + case "bpmnEvent": $class = "BpmnEvent"; break; + default: + throw new \RuntimeException(sprintf("Invalid Object type, accepted types: [%s|%s|%s], given %s.", + "BpmnActivity", "BpmnBpmnGateway", "BpmnEvent", $data["FLO_ELEMENT_DEST_TYPE"] + )); + } + + // Validate origin object exists + if (! $class::exists($data["FLO_ELEMENT_DEST"])) { + throw new \RuntimeException(sprintf("Reference not found, the %s with UID: %s, does not exist!", + ucfirst($data["FLO_ELEMENT_DEST_TYPE"]), $data["FLO_ELEMENT_DEST"] + )); + } + $flow = new Flow(); $flow->fromArray($data, BasePeer::TYPE_FIELDNAME); $flow->setPrjUid($this->getUid()); $flow->setDiaUid($this->getDiagram("object")->getDiaUid()); $flow->save(); - self::log("Add Flow Success!"); + + return $flow->getFloUid(); } catch (\Exception $e) { self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString()); throw $e; diff --git a/workflow/engine/src/ProcessMaker/Project/Workflow.php b/workflow/engine/src/ProcessMaker/Project/Workflow.php index 3dfd0e6f0..148b9cc56 100644 --- a/workflow/engine/src/ProcessMaker/Project/Workflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Workflow.php @@ -325,6 +325,24 @@ class Workflow extends Handler } } + public function removeRouteFromTo($fromTasUid, $toTasUid) + { + try { + self::log("Remove Route from $fromTasUid -> to $toTasUid"); + + $route = Route::findOneBy(array( + RoutePeer::TAS_UID => $fromTasUid, + RoutePeer::ROU_NEXT_TASK => $toTasUid + )); + + $route->delete(); + self::log("Remove Route Success!"); + } catch (\Exception $e) { + self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString()); + throw $e; + } + } + public function getRoute($rouUid) { $route = new Route(); @@ -332,6 +350,11 @@ class Workflow extends Handler return $route->load($rouUid); } + public function getRoutes() + { + return Route::getAll($proUid = null, $start = null, $limit = null, $filter = '', $changeCaseTo = CASE_UPPER); + } + /**************************************************************************************************** * Migrated Methods from class.processMap.php class * diff --git a/workflow/engine/src/ProcessMaker/Util/Logger.php b/workflow/engine/src/ProcessMaker/Util/Logger.php index 6818599fb..7dc8716d4 100644 --- a/workflow/engine/src/ProcessMaker/Util/Logger.php +++ b/workflow/engine/src/ProcessMaker/Util/Logger.php @@ -4,7 +4,7 @@ namespace ProcessMaker\Util; /** * Singleton Class Logger * - * This Utility is usefull to log local messages + * This Utility is useful to log local messages * @package ProcessMaker\Util * @author Erik Amaru Ortiz */ @@ -43,7 +43,7 @@ class Logger $this->setLog(date('Y-m-d H:i:s') . " "); foreach ($args as $str) { - $this->setLog((is_string($str) ? $str : print_r($str, true)) . PHP_EOL); + $this->setLog((is_string($str) ? $str : var_export($str, true)) . PHP_EOL); } } @@ -53,7 +53,7 @@ class Logger $this->setLog(date('Y-m-d H:i:s') . " "); foreach ($args as $str) { - $this->setLog((is_string($str) ? $str : print_r($str, true)) . " "); + $this->setLog((is_string($str) ? $str : var_export($str, true)) . " "); } } diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project.php b/workflow/engine/src/Services/Api/ProcessMaker/Project.php index 140089e54..d8f866620 100644 --- a/workflow/engine/src/Services/Api/ProcessMaker/Project.php +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project.php @@ -249,9 +249,9 @@ class Project extends Api foreach ($diagram["flows"] as $flowData) { $flow = $bwp->getFlow($flowData["FLO_UID"]); if (is_null($flow)) { - $bwp->addFlow($flowData, $diagram); + $bwp->addFlow($flowData, $diagram["flows"]); } elseif (! $bwp->isEquals($flow, $flowData)) { - $bwp->updateFlow($flowData["FLO_UID"], $flowData); + $bwp->updateFlow($flowData["FLO_UID"], $flowData, $diagram["flows"]); } else { Util\Logger::log("Update Flow ({$flowData["FLO_UID"]}) Skipped - No changes required"); } @@ -266,6 +266,8 @@ class Project extends Api } } + $bwp->mapBpmnFlowsToWorkflowRoutes(); + return $result; } catch (\Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); diff --git a/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php b/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php index 2a00fb174..5dd78bdee 100644 --- a/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php +++ b/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php @@ -2,6 +2,8 @@ namespace Tests\ProcessMaker\Project\Adapter; use \ProcessMaker\Project; +use \ProcessMaker\Exception; + if (! class_exists("Propel")) { include_once __DIR__ . "/../../../bootstrap.php"; @@ -19,6 +21,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase public static function tearDownAfterClass() { + return false; //cleaning DB foreach (self::$uids as $prjUid) { $bwap = Project\Adapter\BpmnWorkflow::load($prjUid); @@ -60,6 +63,8 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase $this->assertEquals($project["PRJ_NAME"], $process["PRO_TITLE"]); $this->assertEquals($project["PRJ_DESCRIPTION"], $process["PRO_DESCRIPTION"]); $this->assertEquals($project["PRJ_AUTHOR"], $process["PRO_CREATE_USER"]); + + return $bwap; } function testCreate() @@ -85,8 +90,6 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase $wp = null; } - self::$uids[] = $bwap->getUid(); - $this->assertNotEmpty($bp); $this->assertNotEmpty($wp); $this->assertEquals($bp->getUid(), $wp->getUid()); @@ -98,20 +101,295 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase $this->assertEquals($project["PRJ_DESCRIPTION"], $process["PRO_DESCRIPTION"]); $this->assertEquals($project["PRJ_AUTHOR"], $process["PRO_CREATE_USER"]); + return $bwap; + } + + /** + * @depends testCreate + * @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap + */ + function testRemove(Project\Adapter\BpmnWorkflow $bwap) + { + $prjUid = $bwap->getUid(); + $bwap->remove(); + $bp = $wp = null; + + try { + $bp = Project\Bpmn::load($prjUid); + } catch (Exception\ProjectNotFound $e) {} + + try { + $wp = Project\Workflow::load($prjUid); + } catch (Exception\ProjectNotFound $e) {} + + $this->assertNull($bp); + $this->assertNull($wp); + } + + /* + * Testing Project's Activity + */ + + /** + * @depends testNew + * @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap + * @return string + */ + function testAddActivity($bwap) + { + // before add activity, we need to add a diagram and process to the project $bwap->addDiagram(); $bwap->addProcess(); - // Save to DB - $bwap->addActivity(array( + // add the new activity + $actUid = $bwap->addActivity(array( "ACT_NAME" => "Activity #1", "BOU_X" => "50", "BOU_Y" => "50" )); - $bwap->addActivity(array( - "ACT_NAME" => "Activity #2", - "BOU_X" => "250", - "BOU_Y" => "250" - )); + $wp = Project\Workflow::load($bwap->getUid()); + + $activity = $bwap->getActivity($actUid); + $task = $wp->getTask($actUid); + + $this->assertEquals($activity["ACT_NAME"], $task["TAS_TITLE"]); + $this->assertEquals($activity["BOU_X"], $task["TAS_POSX"]); + $this->assertEquals($activity["BOU_Y"], $task["TAS_POSY"]); + + return $actUid; } -} \ No newline at end of file + + /** + * @depends testNew + * @depends testAddActivity + * @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap + * @param string $actUid + */ + function testUpdateActivity($bwap, $actUid) + { + $updatedData = array( + "ACT_NAME" => "Activity #1 - (Modified)", + "BOU_X" => 122, + "BOU_Y" => 250 + ); + + $bwap->updateActivity($actUid, $updatedData); + $activity = $bwap->getActivity($actUid); + $wp = Project\Workflow::load($bwap->getUid()); + $task = $wp->getTask($actUid); + + $this->assertEquals($activity["ACT_NAME"], $task["TAS_TITLE"]); + $this->assertEquals($activity["BOU_X"], $task["TAS_POSX"]); + $this->assertEquals($activity["BOU_Y"], $task["TAS_POSY"]); + } + + /** + * @depends testNew + * @depends testAddActivity + * @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap + * @param string $actUid + */ + function testRemoveActivity($bwap, $actUid) + { + $bwap->removeActivity($actUid); + $activity = $bwap->getActivity($actUid); + + $this->assertNull($activity); + } + + /* + * Testing Project's Flows + */ + + /** + * @depends testNew + * @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap + * @return string + */ + function testAddActivityToActivityFlow($bwap) + { + $actUid1 = $bwap->addActivity(array( + "ACT_NAME" => "Activity #1", + "BOU_X" => 122, + "BOU_Y" => 222 + )); + $actUid2 = $bwap->addActivity(array( + "ACT_NAME" => "Activity #2", + "BOU_X" => 322, + "BOU_Y" => 422 + )); + + $flowData = array( + 'FLO_TYPE' => 'SEQUENCE', + 'FLO_ELEMENT_ORIGIN' => $actUid1, + 'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnActivity', + 'FLO_ELEMENT_DEST' => $actUid2, + 'FLO_ELEMENT_DEST_TYPE' => 'bpmnActivity', + 'FLO_X1' => 326, + 'FLO_Y1' => 146, + 'FLO_X2' => 461, + 'FLO_Y2' => 146, + ); + + $flowUid = $bwap->addFlow($flowData); + $bwap->mapBpmnFlowsToWorkflowRoutes(); + + $route = \Route::findOneBy(array( + \RoutePeer::TAS_UID => $actUid1, + \RoutePeer::ROU_NEXT_TASK => $actUid2 + )); + + $this->assertNotNull($route); + $this->assertTrue(is_string($flowUid)); + $this->assertEquals(32, strlen($flowUid)); + $this->assertEquals($route->getRouNextTask(), $actUid2); + $this->assertEquals($route->getRouType(), "SEQUENTIAL"); + + return array("flow_uid" => $flowUid, "activitiesUid" => array($actUid1, $actUid2)); + } + + + /** + * @depends testNew + * @depends testAddActivityToActivityFlow + * @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap + * @param array $input + */ + function testRemoveActivityToActivityFlow($bwap, $input) + { + $bwap->removeFlow($input["flow_uid"]); + $this->assertNull($bwap->getFlow($input["flow_uid"])); + + $route = \Route::findOneBy(array( + \RoutePeer::TAS_UID => $input["activitiesUid"][0], + \RoutePeer::ROU_NEXT_TASK => $input["activitiesUid"][1] + )); + + $this->assertNull($route); + + // cleaning + $bwap->removeActivity($input["activitiesUid"][0]); + $bwap->removeActivity($input["activitiesUid"][1]); + + $this->assertCount(0, $bwap->getActivities()); + } + + /** + * @depends testNew + * @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap + */ + function testActivityToInclusiveGatewayToActivityFlowsSingle($bwap) + { + $actUid1 = $bwap->addActivity(array( + "ACT_NAME" => "Activity #1", + "BOU_X" => 198, + "BOU_Y" => 56 + )); + $actUid2 = $bwap->addActivity(array( + "ACT_NAME" => "Activity #2", + "BOU_X" => 198, + "BOU_Y" => 250 + )); + $gatUid = $bwap->addGateway(array( + "GAT_NAME" => "Gateway #1", + "GAT_TYPE" => "INCLUSIVE", + "GAT_DIRECTION" => "DIVERGING", + "BOU_X" => 256, + "BOU_Y" => 163 + )); + + $flowUid1 = $bwap->addFlow(array( + 'FLO_TYPE' => 'SEQUENCE', + 'FLO_ELEMENT_ORIGIN' => $actUid1, + 'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnActivity', + 'FLO_ELEMENT_DEST' => $gatUid, + 'FLO_ELEMENT_DEST_TYPE' => 'bpmnGateway', + 'FLO_X1' => 273, + 'FLO_Y1' => 273, + 'FLO_X2' => 163, + 'FLO_Y2' => 163, + )); + + $flowUid2 = $bwap->addFlow(array( + 'FLO_TYPE' => 'SEQUENCE', + 'FLO_ELEMENT_ORIGIN' => $gatUid, + 'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnGateway', + 'FLO_ELEMENT_DEST' => $actUid2, + 'FLO_ELEMENT_DEST_TYPE' => 'bpmnActivity', + 'FLO_X1' => 273, + 'FLO_Y1' => 273, + 'FLO_X2' => 249, + 'FLO_Y2' => 249, + )); + + $bwap->mapBpmnFlowsToWorkflowRoutes(); + + // cleaning + $bwap->removeActivity($actUid1); + $bwap->removeActivity($actUid2); + $bwap->removeFlow($flowUid1); + $bwap->removeFlow($flowUid2); + + $this->assertCount(0, $bwap->getActivities()); + $this->assertCount(0, $bwap->getFlows()); + + $wp = Project\Workflow::load($bwap->getUid()); + + $this->assertCount(0, $wp->getTasks()); + $this->assertCount(0, $wp->getRoutes()); + } + + /** + * @depends testNew + * @param \ProcessMaker\Project\Adapter\BpmnWorkflow $bwap + */ + function testActivityToInclusiveGatewayToActivityFlowsMultiple($bwap) + { + /*$actUid1 = $bwap->addActivity(array( + "ACT_NAME" => "Activity #1", + "BOU_X" => 198, + "BOU_Y" => 56 + )); + $actUid2 = $bwap->addActivity(array( + "ACT_NAME" => "Activity #2", + "BOU_X" => 198, + "BOU_Y" => 250 + )); + $gatUid = $bwap->addGateway(array( + "GAT_NAME" => "Gateway #1", + "GAT_TYPE" => "INCLUSIVE", + "GAT_DIRECTION" => "DIVERGING", + "BOU_X" => 256, + "BOU_Y" => 163 + )); + + $flowUid1 = $bwap->addFlow(array( + 'FLO_TYPE' => 'SEQUENCE', + 'FLO_ELEMENT_ORIGIN' => $actUid1, + 'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnActivity', + 'FLO_ELEMENT_DEST' => $gatUid, + 'FLO_ELEMENT_DEST_TYPE' => 'bpmnGateway', + 'FLO_X1' => 273, + 'FLO_Y1' => 273, + 'FLO_X2' => 163, + 'FLO_Y2' => 163, + )); + + $flowUid1 = $bwap->addFlow(array( + 'FLO_TYPE' => 'SEQUENCE', + 'FLO_ELEMENT_ORIGIN' => $gatUid, + 'FLO_ELEMENT_ORIGIN_TYPE' => 'bpmnGateway', + 'FLO_ELEMENT_DEST' => $actUid2, + 'FLO_ELEMENT_DEST_TYPE' => 'bpmnActivity', + 'FLO_X1' => 273, + 'FLO_Y1' => 273, + 'FLO_X2' => 249, + 'FLO_Y2' => 249, + )); + + $bwap->mapBpmnFlowsToWorkflowRoutes();*/ + } +} + + From 75cf6e3eead963836ea417a2fb142525f14aaea0 Mon Sep 17 00:00:00 2001 From: Erik Amaru Ortiz Date: Mon, 24 Feb 2014 19:58:32 -0400 Subject: [PATCH 5/8] Adding logic to remove related objects when a gateway is removed for BpmnWorkflow Adapter - Now when a gateway is removed all its related flows are removed too - When a gateway is removed all Composed Workflow Routes are removed too --- workflow/engine/classes/model/BpmnFlow.php | 18 +++++++++++++ .../Project/Adapter/BpmnWorkflow.php | 27 ++++++++++++++++++- .../engine/src/ProcessMaker/Project/Bpmn.php | 3 +++ .../Project/Adapter/BpmnWorkflowTest.php | 6 ++--- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/workflow/engine/classes/model/BpmnFlow.php b/workflow/engine/classes/model/BpmnFlow.php index 6d800f692..64ae9c04e 100644 --- a/workflow/engine/classes/model/BpmnFlow.php +++ b/workflow/engine/classes/model/BpmnFlow.php @@ -16,6 +16,24 @@ require_once 'classes/model/om/BaseBpmnFlow.php'; */ class BpmnFlow extends BaseBpmnFlow { + public static function removeAllRelated($elementUid) + { + $c = new Criteria('workflow'); + + $c1 = $c->getNewCriterion(BpmnFlowPeer::FLO_ELEMENT_ORIGIN, $elementUid); + $c2 = $c->getNewCriterion(BpmnFlowPeer::FLO_ELEMENT_DEST, $elementUid); + + $c1->addOr($c2); + $c->add($c1); + + $flows = BpmnFlowPeer::doSelect($c); + + foreach ($flows as $flow) { + $flow->delete(); + } + } + + /** * @param $field string coming from \BpmnFlowPeer:: * @param $value string diff --git a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php index 7ec39c752..1470fc8e4 100644 --- a/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Adapter/BpmnWorkflow.php @@ -3,7 +3,6 @@ namespace ProcessMaker\Project\Adapter; use ProcessMaker\Project; use ProcessMaker\Util\Hash; -use Symfony\Component\DependencyInjection\Exception\LogicException; /** * Class BpmnWorkflow @@ -149,6 +148,32 @@ class BpmnWorkflow extends Project\Bpmn $this->wp->removeTask($actUid); } + public function removeGateway($gatUid) + { + $gatewayData = $this->getGateway($gatUid); + $flowsDest = \BpmnFlow::findAllBy(\BpmnFlowPeer::FLO_ELEMENT_DEST, $gatUid); + + foreach ($flowsDest as $flowDest) { + switch ($flowDest->getFloElementOriginType()) { + case "bpmnActivity": + $actUid = $flowDest->getFloElementOrigin(); + $flowsOrigin = \BpmnFlow::findAllBy(\BpmnFlowPeer::FLO_ELEMENT_ORIGIN, $gatUid); + + foreach ($flowsOrigin as $flowOrigin) { + switch ($flowOrigin->getFloElementDestType()) { + case "bpmnActivity": + $toActUid = $flowOrigin->getFloElementDest(); + $this->wp->removeRouteFromTo($actUid, $toActUid); + break; + } + } + break; + } + } + + parent::removeGateway($gatUid); + } + // public function addFlow($data) // { // parent::addFlow($data); diff --git a/workflow/engine/src/ProcessMaker/Project/Bpmn.php b/workflow/engine/src/ProcessMaker/Project/Bpmn.php index a19110254..44e5b3541 100644 --- a/workflow/engine/src/ProcessMaker/Project/Bpmn.php +++ b/workflow/engine/src/ProcessMaker/Project/Bpmn.php @@ -500,6 +500,9 @@ class Bpmn extends Handler $gateway = GatewayPeer::retrieveByPK($gatUid); $gateway->delete(); + // remove related object (flows) + Flow::removeAllRelated($gatUid); + self::log("Remove Gateway Success!"); } catch (\Exception $e) { self::log("Exception: ", $e->getMessage(), "Trace: ", $e->getTraceAsString()); diff --git a/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php b/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php index 5dd78bdee..78fce2c48 100644 --- a/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php +++ b/workflow/engine/src/Tests/ProcessMaker/Project/Adapter/BpmnWorkflowTest.php @@ -21,7 +21,7 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase public static function tearDownAfterClass() { - return false; + //return false; //cleaning DB foreach (self::$uids as $prjUid) { $bwap = Project\Adapter\BpmnWorkflow::load($prjUid); @@ -328,10 +328,10 @@ class BpmnWorkflowTest extends \PHPUnit_Framework_TestCase // cleaning $bwap->removeActivity($actUid1); $bwap->removeActivity($actUid2); - $bwap->removeFlow($flowUid1); - $bwap->removeFlow($flowUid2); + $bwap->removeGateway($gatUid); $this->assertCount(0, $bwap->getActivities()); + $this->assertCount(0, $bwap->getGateways()); $this->assertCount(0, $bwap->getFlows()); $wp = Project\Workflow::load($bwap->getUid()); From d50cd2a2e1ae9e27b3d823b974ebd104cfae92de Mon Sep 17 00:00:00 2001 From: Freddy Daniel Rojas Valda Date: Tue, 25 Feb 2014 09:17:11 -0400 Subject: [PATCH 6/8] Se mejora BEHAT FILESMANAGER. --- .../basic_sequence_files_manager.feature | 2 +- features/bootstrap/RestContext.php | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/features/backend/files_manager/basic_sequence_files_manager.feature b/features/backend/files_manager/basic_sequence_files_manager.feature index 68d5d7ffb..06088e786 100644 --- a/features/backend/files_manager/basic_sequence_files_manager.feature +++ b/features/backend/files_manager/basic_sequence_files_manager.feature @@ -86,7 +86,7 @@ Feature: Files Manager Resources #Para que funcione este test, debe existir el archivo que se quiere subir Scenario: Post files - Given POST I want to upload the file "/home/daniel/test.txt" to path "public". Url to create prf_uid "project/1265557095225ff5c688f46031700471/file-manager" and updload "project/1265557095225ff5c688f46031700471/file-manager/upload" + Given POST I want to upload the file "/home/daniel/test.txt" to path "public". Url to create prf_uid "project/1265557095225ff5c688f46031700471/file-manager" and updload "project/1265557095225ff5c688f46031700471/file-manager" Scenario: Delete file Given that I want to delete a "public/test.txt" diff --git a/features/bootstrap/RestContext.php b/features/bootstrap/RestContext.php index e6e26edca..5e577044d 100644 --- a/features/bootstrap/RestContext.php +++ b/features/bootstrap/RestContext.php @@ -1329,18 +1329,22 @@ class RestContext extends BehatContext $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$postUrl); curl_setopt($ch, CURLOPT_HTTPHEADER,$headr); - curl_setopt($ch, CURLOPT_POSTFIELDS, array('prf_filename'=>$sfile, "prf_path" => $path, "prf_content" => "")); + curl_setopt($ch, CURLOPT_POSTFIELDS, array('prf_filename'=>$sfile, "prf_path" => $path, "prf_content" => NULL)); curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $postResult = curl_exec($ch); curl_close($ch); - $aResult = explode(",",$postResult); - $aFileUid = explode(":",$aResult[0]); - $prfUid = trim(str_replace('"','',$aFileUid[1])); + $postResult = (array)json_decode($postResult); + if (sizeof($postResult) > 2) { + $prfUid = $postResult["prf_uid"]; + } else { + var_dump($postResult["error"]); + } + $url = $url.$prfUid."/upload"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HTTPHEADER,$headr); - curl_setopt($ch, CURLOPT_POSTFIELDS, array('my_file'=>'@'.$prfFile, 'prf_uid' => $prfUid)); + curl_setopt($ch, CURLOPT_POSTFIELDS, array('prf_file'=>'@'.$prfFile)); curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $postResult = curl_exec($ch); From 8b91cb3ccf4c0259c77144ac9a0398cbe8268316 Mon Sep 17 00:00:00 2001 From: Freddy Daniel Rojas Valda Date: Tue, 25 Feb 2014 09:29:08 -0400 Subject: [PATCH 7/8] Se mejora BEHAT PROCESSSUPERVISOR. --- .../backend/process_supervisor/main_tests_supervisor.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/backend/process_supervisor/main_tests_supervisor.feature b/features/backend/process_supervisor/main_tests_supervisor.feature index 1a1c5d767..ec7f35260 100644 --- a/features/backend/process_supervisor/main_tests_supervisor.feature +++ b/features/backend/process_supervisor/main_tests_supervisor.feature @@ -209,7 +209,7 @@ Requirements: Given POST this data: """ { - "dyn_uid": "<92562207752ceef36c7d874048012431>" + "dyn_uid": "92562207752ceef36c7d874048012431" } """ And I request "project/85794888452ceeef3675164057928956/process-supervisor/dynaform" From 0a5f7e23827ddde96e946dff542c00e3c64c97c2 Mon Sep 17 00:00:00 2001 From: Freddy Daniel Rojas Valda Date: Tue, 25 Feb 2014 09:50:33 -0400 Subject: [PATCH 8/8] Se mejora PROCESSSUPERVISOR. --- workflow/engine/src/BusinessModel/FilesManager.php | 3 ++- .../src/Services/Api/ProcessMaker/Project/FilesManager.php | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/workflow/engine/src/BusinessModel/FilesManager.php b/workflow/engine/src/BusinessModel/FilesManager.php index f6fa3c22b..c9d4d9879 100644 --- a/workflow/engine/src/BusinessModel/FilesManager.php +++ b/workflow/engine/src/BusinessModel/FilesManager.php @@ -336,7 +336,8 @@ class FilesManager 'prf_type' => $oProcessFiles->getPrfType(), 'prf_editable' => $sEditable, 'prf_create_date' => $oProcessFiles->getPrfCreateDate(), - 'prf_update_date' => $oProcessFiles->getPrfUpdateDate()); + 'prf_update_date' => $oProcessFiles->getPrfUpdateDate(), + 'prf_content' => $content); return $oProcessFile; } catch (Exception $e) { throw $e; diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project/FilesManager.php b/workflow/engine/src/Services/Api/ProcessMaker/Project/FilesManager.php index ce9e674ea..7feb40af8 100644 --- a/workflow/engine/src/Services/Api/ProcessMaker/Project/FilesManager.php +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project/FilesManager.php @@ -143,7 +143,10 @@ class ProcessFilesManagerStructure * @var string {@from body} */ public $prf_path; - + + /** + * @var string {@from body} + */ public $prf_content; }