diff --git a/workflow/engine/src/BusinessModel/Step.php b/workflow/engine/src/BusinessModel/Step.php index 5a75001df..1c3519cac 100644 --- a/workflow/engine/src/BusinessModel/Step.php +++ b/workflow/engine/src/BusinessModel/Step.php @@ -186,7 +186,7 @@ class Step "step_type_obj" => $row["STEP_TYPE_OBJ"], "step_uid_obj" => $row["STEP_UID_OBJ"], "step_condition" => $row["STEP_CONDITION"], - "step_position" => $row["STEP_POSITION"], + "step_position" => (int)($row["STEP_POSITION"]), "step_mode" => $row["STEP_MODE"], "obj_title" => $titleObj, "obj_description" => $descriptionObj @@ -197,5 +197,184 @@ class Step throw $e; } } + + /** + * Get data of unique ids of an Step (Unique id of Task and Process) + * + * @param string $stepUid Unique id of the Step + * + * return array + */ + public function getDataUids($stepUid) + { + try { + $criteria = new \Criteria("workflow"); + + $criteria->addSelectColumn(\StepPeer::PRO_UID); + $criteria->addSelectColumn(\StepPeer::TAS_UID); + $criteria->add(\StepPeer::STEP_UID, $stepUid, \Criteria::EQUAL); + + $rsCriteria = \StepPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + $rsCriteria->next(); + + return $rsCriteria->getRow(); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Get available triggers for an Step + * + * @param string $stepUid Unique id of the Step + * @param string $type Type (BEFORE, AFTER) + * + * return array + */ + public function getAvailableTriggers($stepUid, $type) + { + try { + $arrayAvailableTrigger = array(); + + $trigger = new \BusinessModel\Trigger(); + + $arrayDataUid = $this->getDataUids($stepUid); + + $processUid = $arrayDataUid["PRO_UID"]; + + //Get Uids + $arrayUid = array(); + + $criteria = new \Criteria("workflow"); + + $criteria->addSelectColumn(\StepTriggerPeer::TRI_UID); + $criteria->add(\StepTriggerPeer::STEP_UID, $stepUid, \Criteria::EQUAL); + $criteria->add(\StepTriggerPeer::ST_TYPE, $type, \Criteria::EQUAL); + + $rsCriteria = \StepTriggerPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + while ($rsCriteria->next()) { + $row = $rsCriteria->getRow(); + + $arrayUid[] = $row["TRI_UID"]; + } + + //Criteria + $criteria = $trigger->getTriggerCriteria(); + + $criteria->add(\TriggersPeer::TRI_UID, $arrayUid, \Criteria::NOT_IN); + $criteria->add(\TriggersPeer::PRO_UID, $processUid, \Criteria::EQUAL); + $criteria->addAscendingOrderByColumn("TRI_TITLE"); + + $rsCriteria = \TriggersPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + while ($rsCriteria->next()) { + $row = $rsCriteria->getRow(); + + $arrayAvailableTrigger[] = array( + "tri_uid" => $row["TRI_UID"], + "tri_title" => $row["TRI_TITLE"], + "tri_description" => $row["TRI_DESCRIPTION"], + "tri_type" => $row["TRI_TYPE"], + "tri_webbot" => $row["TRI_WEBBOT"], + "tri_param" => $row["TRI_PARAM"] + ); + } + + return $arrayAvailableTrigger; + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Get all triggers of an Step + * + * @param string $stepUid Unique id of the Step + * + * return array + */ + public function getTriggers($stepUid) + { + try { + $arrayTrigger = array(); + + $trigger = new \BusinessModel\Trigger(); + + $arrayDataUid = $this->getDataUids($stepUid); + + $taskUid = $arrayDataUid["TAS_UID"]; + + $processMap = new \ProcessMap(); + $stepTrigger = new \StepTrigger(); + + $arrayTriggerType1 = array( + "BEFORE" => "BEFORE", + "AFTER" => "AFTER" + ); + + $arrayTriggerType2 = array( + "BEFORE_ASSIGNMENT" => "BEFORE", + "BEFORE_ROUTING" => "BEFORE", + "AFTER_ROUTING" => "AFTER" + ); + + $arrayTriggerType = ($stepUid != "")? $arrayTriggerType1 : $arrayTriggerType2; + + foreach ($arrayTriggerType as $index => $value) { + $triggerType = $index; + $type = $value; + + switch ($triggerType) { + case "BEFORE_ASSIGNMENT": + $stepUid = "-1"; + break; + case "BEFORE_ROUTING": + $stepUid = "-2"; + break; + case "AFTER_ROUTING": + $stepUid = "-2"; + break; + } + + $stepTrigger->orderPosition($stepUid, $taskUid, $type); + + //Criteria + $criteria = $trigger->getTriggerCriteria(); + + $criteria->addSelectColumn(\StepTriggerPeer::ST_CONDITION); + $criteria->addSelectColumn(\StepTriggerPeer::ST_POSITION); + $criteria->addJoin(\StepTriggerPeer::TRI_UID, \TriggersPeer::TRI_UID, \Criteria::LEFT_JOIN); + $criteria->add(\StepTriggerPeer::STEP_UID, $stepUid, \Criteria::EQUAL); + $criteria->add(\StepTriggerPeer::TAS_UID, $taskUid, \Criteria::EQUAL); + $criteria->add(\StepTriggerPeer::ST_TYPE, $type, \Criteria::EQUAL); + $criteria->addAscendingOrderByColumn(\StepTriggerPeer::ST_POSITION); + + $rsCriteria = \StepTriggerPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + while ($rsCriteria->next()) { + $row = $rsCriteria->getRow(); + + $arrayTrigger[] = array( + "tri_uid" => $row["TRI_UID"], + "tri_title" => $row["TRI_TITLE"], + "tri_description" => $row["TRI_DESCRIPTION"], + "st_type" => $triggerType, + "st_condition" => $row["ST_CONDITION"], + "st_position" => (int)($row["ST_POSITION"]) + ); + } + } + + return $arrayTrigger; + } catch (\Exception $e) { + throw $e; + } + } } diff --git a/workflow/engine/src/BusinessModel/Step/Trigger.php b/workflow/engine/src/BusinessModel/Step/Trigger.php new file mode 100644 index 000000000..3502710f0 --- /dev/null +++ b/workflow/engine/src/BusinessModel/Step/Trigger.php @@ -0,0 +1,118 @@ +getDataUids($stepUid); + + $taskUid = $arrayDataUid["TAS_UID"]; + + //Create + $stepTrigger = new \StepTrigger(); + + $stepTrigger->create(array("STEP_UID" => $stepUid, "TAS_UID" => $taskUid, "TRI_UID" => $triggerUid, "ST_TYPE" => $type)); + + if (!isset($arrayData["st_position"]) || $arrayData["st_position"] == "") { + $arrayData["st_position"] = $stepTrigger->getNextPosition($stepUid, $type, $taskUid) - 1; + } + + $this->update($stepUid, $triggerUid, $type, $arrayData); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Update Trigger of an Step + * + * @param string $stepUid Unique id of the Step + * @param string $triggerUid Unique id of the Trigger + * @param string $type Type (BEFORE, AFTER) + * @param array $arrayData Data + * + * return void + */ + public function update($stepUid, $triggerUid, $type, $arrayData) + { + try { + $step = new \BusinessModel\Step(); + + $arrayDataUid = $step->getDataUids($stepUid); + + $taskUid = $arrayDataUid["TAS_UID"]; + + //Update + $stepTrigger = new \StepTrigger(); + + $arrayUpdateData = array(); + + $arrayUpdateData["STEP_UID"] = $stepUid; + $arrayUpdateData["TAS_UID"] = $taskUid; + $arrayUpdateData["TRI_UID"] = $triggerUid; + $arrayUpdateData["ST_TYPE"] = $type; + + if (isset($arrayData["st_condition"])) { + $arrayUpdateData["ST_CONDITION"] = $arrayData["st_condition"]; + } + + if (isset($arrayData["st_position"]) && $arrayData["st_position"] != "") { + $arrayUpdateData["ST_POSITION"] = (int)($arrayData["st_position"]); + } + + $stepTrigger->update($arrayUpdateData); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Delete Trigger of an Step + * + * @param string $stepUid Unique id of the Step + * @param string $triggerUid Unique id of the Trigger + * @param string $type Type (BEFORE, AFTER) + * + * return void + */ + public function delete($stepUid, $triggerUid, $type) + { + try { + $step = new \BusinessModel\Step(); + + $arrayDataUid = $step->getDataUids($stepUid); + + $taskUid = $arrayDataUid["TAS_UID"]; + + //Get position + $stepTrigger = new \StepTrigger(); + + $arrayData = $stepTrigger->load($stepUid, $taskUid, $triggerUid, $type); + + $position = (int)($arrayData["ST_POSITION"]); + + //Delete + $stepTrigger = new \StepTrigger(); + + $stepTrigger->reOrder($stepUid, $taskUid, $type, $position); + $stepTrigger->remove($stepUid, $taskUid, $triggerUid, $type); + } catch (\Exception $e) { + throw $e; + } + } +} + diff --git a/workflow/engine/src/BusinessModel/Task.php b/workflow/engine/src/BusinessModel/Task.php index c190424c9..41feece2b 100644 --- a/workflow/engine/src/BusinessModel/Task.php +++ b/workflow/engine/src/BusinessModel/Task.php @@ -248,18 +248,47 @@ class Task } /** - * Get available steps of an Task + * Get data of unique ids of an Task (Unique id of Process) * - * @param string $taskUid - * @param string $processUid + * @param string $taskUid Unique id of the Task * * return array */ - public function getAvailableSteps($taskUid, $processUid) + public function getDataUids($taskUid) + { + try { + $criteria = new \Criteria("workflow"); + + $criteria->addSelectColumn(\TaskPeer::PRO_UID); + $criteria->add(\TaskPeer::TAS_UID, $taskUid, \Criteria::EQUAL); + + $rsCriteria = \TaskPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + $rsCriteria->next(); + + return $rsCriteria->getRow(); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Get available steps of an Task + * + * @param string $taskUid + * + * return array + */ + public function getAvailableSteps($taskUid) { try { $arrayAvailableStep = array(); + $arrayDataUid = $this->getDataUids($taskUid); + + $processUid = $arrayDataUid["PRO_UID"]; + //Get Uids $arrayUid = array(); diff --git a/workflow/engine/src/BusinessModel/Trigger.php b/workflow/engine/src/BusinessModel/Trigger.php new file mode 100644 index 000000000..d8c9996b4 --- /dev/null +++ b/workflow/engine/src/BusinessModel/Trigger.php @@ -0,0 +1,83 @@ +addSelectColumn(\TriggersPeer::TRI_UID); + $criteria->addAsColumn("TRI_TITLE", "CT.CON_VALUE"); + $criteria->addAsColumn("TRI_DESCRIPTION", "CD.CON_VALUE"); + $criteria->addSelectColumn(\TriggersPeer::TRI_TYPE); + $criteria->addSelectColumn(\TriggersPeer::TRI_WEBBOT); + $criteria->addSelectColumn(\TriggersPeer::TRI_PARAM); + + $criteria->addAlias("CT", "CONTENT"); + $criteria->addAlias("CD", "CONTENT"); + + $arrayCondition = array(); + $arrayCondition[] = array(\TriggersPeer::TRI_UID, "CT.CON_ID", \Criteria::EQUAL); + $arrayCondition[] = array("CT.CON_CATEGORY", $delimiter . "TRI_TITLE" . $delimiter, \Criteria::EQUAL); + $arrayCondition[] = array("CT.CON_LANG", $delimiter . SYS_LANG . $delimiter, \Criteria::EQUAL); + $criteria->addJoinMC($arrayCondition, \Criteria::LEFT_JOIN); + + $arrayCondition = array(); + $arrayCondition[] = array(\TriggersPeer::TRI_UID, "CD.CON_ID", \Criteria::EQUAL); + $arrayCondition[] = array("CD.CON_CATEGORY", $delimiter . "TRI_DESCRIPTION" . $delimiter, \Criteria::EQUAL); + $arrayCondition[] = array("CD.CON_LANG", $delimiter . SYS_LANG . $delimiter, \Criteria::EQUAL); + $criteria->addJoinMC($arrayCondition, \Criteria::LEFT_JOIN); + + return $criteria; + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Get data of an Trigger + * + * @param string $triggerUid Unique id of the Trigger + * + * return array + */ + public function getTrigger($triggerUid) + { + try { + //Criteria + $criteria = $this->getTriggerCriteria(); + + $criteria->add(\TriggersPeer::TRI_UID, $triggerUid, \Criteria::EQUAL); + + $rsCriteria = \TriggersPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + $rsCriteria->next(); + + $row = $rsCriteria->getRow(); + + $arrayTrigger = array( + "tri_uid" => $row["TRI_UID"], + "tri_title" => $row["TRI_TITLE"], + "tri_description" => $row["TRI_DESCRIPTION"], + "tri_type" => $row["TRI_TYPE"], + "tri_webbot" => $row["TRI_WEBBOT"], + "tri_param" => $row["TRI_PARAM"] + ); + + return $arrayTrigger; + } catch (\Exception $e) { + throw $e; + } + } +} + diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity.php b/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity.php index ca6837cc2..8fe994aee 100644 --- a/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity.php +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity.php @@ -109,7 +109,7 @@ class Activity extends Api try { $task = new \BusinessModel\Task(); - $response = $task->getAvailableSteps($activityUid, $projectUid); + $response = $task->getAvailableSteps($activityUid); return $response; } catch (\Exception $e) { diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity/Step.php b/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity/Step.php index 2c24c981d..a993bd31a 100644 --- a/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity/Step.php +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity/Step.php @@ -87,6 +87,43 @@ class Step extends Api throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } + + /** + * @url GET /:projectUid/activity/:activityUid/step/:stepUid/triggers + */ + public function doGetActivityStepTriggers($stepUid, $activityUid, $projectUid) + { + try { + $step = new \BusinessModel\Step(); + + $response = $step->getTriggers($stepUid); + + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + /** + * @url GET /:projectUid/activity/:activityUid/step/:stepUid/available-triggers/:type + * + * @param string $stepUid + * @param string $activityUid + * @param string $projectUid + * @param string $type {@from body}{@choice before,after} + */ + public function doGetActivityStepAvailableTriggers($stepUid, $activityUid, $projectUid, $type) + { + try { + $step = new \BusinessModel\Step(); + + $response = $step->getAvailableTriggers($stepUid, strtoupper($type)); + + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } } class StepStructure @@ -120,4 +157,5 @@ class StepStructure * @var string {@from body}{@choice EDIT,VIEW} */ public $step_mode; -} \ No newline at end of file +} + diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity/Step/Trigger.php b/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity/Step/Trigger.php new file mode 100644 index 000000000..bc671c3df --- /dev/null +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project/Activity/Step/Trigger.php @@ -0,0 +1,118 @@ +getTrigger($triggerUid); + + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + /** + * @url POST /:projectUid/activity/:activityUid/step/:stepUid/trigger + * + * @param string $stepUid + * @param string $activityUid + * @param string $projectUid + * @param StepTriggerStructure $request_data + * + * @status 201 + */ + public function doPostActivityStepTrigger($stepUid, $activityUid, $projectUid, StepTriggerStructure $request_data = null) + { + try { + $request_data = (array)($request_data); + + $stepTrigger = new \BusinessModel\Step\Trigger(); + + $stepTrigger->create($stepUid, $request_data["tri_uid"], $request_data["st_type"], $request_data); + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + /** + * @url PUT /:projectUid/activity/:activityUid/step/:stepUid/trigger/:triggerUid + * + * @param string $triggerUid + * @param string $stepUid + * @param string $activityUid + * @param string $projectUid + * @param StepTriggerStructure $request_data + */ + public function doPutActivityStepTrigger($triggerUid, $stepUid, $activityUid, $projectUid, StepTriggerStructure $request_data = null) + { + try { + $request_data = (array)($request_data); + + $stepTrigger = new \BusinessModel\Step\Trigger(); + + $stepTrigger->update($stepUid, $triggerUid, $request_data["st_type"], $request_data); + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + /** + * @url DELETE /:projectUid/activity/:activityUid/step/:stepUid/trigger/:triggerUid/:type + * + * @param string $triggerUid + * @param string $stepUid + * @param string $activityUid + * @param string $projectUid + * @param string $type {@from body}{@choice before,after} + */ + public function doDeleteActivityStepTrigger($triggerUid, $stepUid, $activityUid, $projectUid, $type) + { + try { + $stepTrigger = new \BusinessModel\Step\Trigger(); + + $stepTrigger->delete($stepUid, $triggerUid, strtoupper($type)); + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } +} + +class StepTriggerStructure +{ + /** + * @var string {@from body}{@min 32}{@max 32} + */ + public $tri_uid; + + /** + * @var string {@from body}{@choice BEFORE,AFTER}{@required true} + */ + public $st_type; + + /** + * @var string + */ + public $st_condition; + + /** + * @var int {@from body}{@min 1} + */ + public $st_position; +} + diff --git a/workflow/engine/src/Services/api.ini b/workflow/engine/src/Services/api.ini index d4cae4ed5..93012fa9d 100644 --- a/workflow/engine/src/Services/api.ini +++ b/workflow/engine/src/Services/api.ini @@ -15,5 +15,5 @@ debug = 1 [alias: project] activity = "Services\Api\ProcessMaker\Project\Activity" step = "Services\Api\ProcessMaker\Project\Activity\Step" + trigger = "Services\Api\ProcessMaker\Project\Activity\Step\Trigger" assignee = "Services\Api\ProcessMaker\Project\Activity\Assignee" -