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());