diff --git a/workflow/engine/classes/model/CaseTrackerObject.php b/workflow/engine/classes/model/CaseTrackerObject.php index 9067fde87..cd433323c 100755 --- a/workflow/engine/classes/model/CaseTrackerObject.php +++ b/workflow/engine/classes/model/CaseTrackerObject.php @@ -160,5 +160,30 @@ class CaseTrackerObject extends BaseCaseTrackerObject throw ($e); } } + + /** + * verify if a dynaform is assigned some steps + * + * @param string $proUid the uid of the process + * @param string $dynUid the uid of the dynaform + * + * @return array + */ + public function verifyDynaformAssigCaseTracker ($dynUid, $proUid) + { + $res = array(); + $oCriteria = new Criteria(); + $oCriteria->addSelectColumn( CaseTrackerObjectPeer::CTO_UID ); + $oCriteria->add( CaseTrackerObjectPeer::PRO_UID, $proUid ); + $oCriteria->add( CaseTrackerObjectPeer::CTO_UID_OBJ, $dynUid ); + $oCriteria->add( CaseTrackerObjectPeer::CTO_TYPE_OBJ, 'DYNAFORM' ); + $oDataset = CaseTrackerObjectPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + while($oDataset->next()) { + $res[] = $oDataset->getRow(); + } + return $res; + } + } diff --git a/workflow/engine/classes/model/ObjectPermission.php b/workflow/engine/classes/model/ObjectPermission.php index e0e45dcd6..722491bcd 100755 --- a/workflow/engine/classes/model/ObjectPermission.php +++ b/workflow/engine/classes/model/ObjectPermission.php @@ -125,5 +125,29 @@ class ObjectPermission extends BaseObjectPermission $aRow = $oDataset->getRow(); return ($aRow); } + + /** + * verify if a dynaform is assigned some steps + * + * @param string $proUid the uid of the process + * @param string $dynUid the uid of the dynaform + * + * @return array + */ + public function verifyDynaformAssigObjectPermission ($dynUid, $proUid) + { + $res = array(); + $oCriteria = new Criteria(); + $oCriteria->addSelectColumn( ObjectPermissionPeer::OP_UID ); + $oCriteria->add( ObjectPermissionPeer::PRO_UID, $proUid ); + $oCriteria->add( ObjectPermissionPeer::OP_OBJ_UID, $dynUid ); + $oCriteria->add( ObjectPermissionPeer::OP_OBJ_TYPE, 'DYNAFORM' ); + $oDataset = ObjectPermissionPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + while($oDataset->next()) { + $res[] = $oDataset->getRow(); + } + return $res; + } } diff --git a/workflow/engine/classes/model/Step.php b/workflow/engine/classes/model/Step.php index 78f0b90b0..57f1bbd09 100755 --- a/workflow/engine/classes/model/Step.php +++ b/workflow/engine/classes/model/Step.php @@ -346,7 +346,7 @@ class Step extends BaseStep } /** - * verify if a dynaform is assigned some steps + * verify if a dynaform is assigned some steps * * @param string $sproUid the uid of the process * @param string $sObjUID the uid of the dynaform @@ -405,6 +405,35 @@ class Step extends BaseStep die(); } + /** + * verify if a dynaform is assigned some steps + * + * @param string $proUid the uid of the process + * @param string $dynUid the uid of the dynaform + * + * @return array + */ + public function verifyDynaformAssigStep ($dynUid, $proUid) + { + $res = array(); + $oCriteria = new Criteria(); + $oCriteria->addSelectColumn( StepPeer::TAS_UID ); + $oCriteria->addSelectColumn( ContentPeer::CON_VALUE ); + $oCriteria->addSelectColumn( StepPeer::STEP_POSITION ); + $oCriteria->add( StepPeer::PRO_UID, $proUid ); + $oCriteria->add( StepPeer::STEP_UID_OBJ, $dynUid ); + $oCriteria->add( StepPeer::STEP_TYPE_OBJ, 'DYNAFORM' ); + $oCriteria->add( ContentPeer::CON_CATEGORY, 'TAS_TITLE'); + $oCriteria->add( ContentPeer::CON_LANG, SYS_LANG); + $oCriteria->addJoin( StepPeer::TAS_UID, ContentPeer::CON_ID, Criteria::INNER_JOIN); + $oDataset = StepPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + while($oDataset->next()) { + $res[] = $oDataset->getRow(); + } + return $res; + } + public function getAttribute ($node, $attName) { diff --git a/workflow/engine/classes/model/StepSupervisor.php b/workflow/engine/classes/model/StepSupervisor.php index 529747493..faa3ec31c 100755 --- a/workflow/engine/classes/model/StepSupervisor.php +++ b/workflow/engine/classes/model/StepSupervisor.php @@ -224,5 +224,29 @@ class StepSupervisor extends BaseStepSupervisor $aRow = $oDataset->getRow(); return ($aRow); } + + /** + * verify if a dynaform is assigned some steps + * + * @param string $proUid the uid of the process + * @param string $dynUid the uid of the dynaform + * + * @return array + */ + public function verifyDynaformAssigStepSupervisor ($dynUid, $proUid) + { + $res = array(); + $oCriteria = new Criteria(); + $oCriteria->addSelectColumn( StepSupervisorPeer::STEP_UID ); + $oCriteria->add( StepSupervisorPeer::PRO_UID, $proUid ); + $oCriteria->add( StepSupervisorPeer::STEP_UID_OBJ, $dynUid ); + $oCriteria->add( StepSupervisorPeer::STEP_TYPE_OBJ, 'DYNAFORM' ); + $oDataset = StepSupervisorPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + while($oDataset->next()) { + $res[] = $oDataset->getRow(); + } + return $res; + } } diff --git a/workflow/engine/src/BusinessModel/DynaForm.php b/workflow/engine/src/BusinessModel/DynaForm.php index 820b24dcd..2664aa1e6 100644 --- a/workflow/engine/src/BusinessModel/DynaForm.php +++ b/workflow/engine/src/BusinessModel/DynaForm.php @@ -139,20 +139,99 @@ class DynaForm * * return bool Return true if a DynaForm is assigned some Steps, false otherwise */ - public function dynaFormAssignedStep($dynaFormUid, $processUid) + public function dynaFormDepends($dynUid, $proUid) { - try { - $step = new \Step(); + $oCriteria = new \Criteria(); + $oCriteria->addSelectColumn( \DynaformPeer::DYN_TYPE ); + $oCriteria->add( \DynaformPeer::DYN_UID, $dynUid ); + $oCriteria->add( \DynaformPeer::PRO_UID, $proUid ); + $oDataset = \DynaformPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC ); + $oDataset->next(); + $dataDyna = $oDataset->getRow(); - $arrayData = $step->loadInfoAssigDynaform($processUid, $dynaFormUid); + if ($dataDyna['DYN_TYPE'] == 'grid') { + $formsDepend = array(); + \G::LoadSystem( 'dynaformhandler' ); - if (is_array($arrayData)) { - return true; - } else { - return false; + $oCriteria = new \Criteria( 'workflow' ); + $oCriteria->addSelectColumn( \DynaformPeer::DYN_UID ); + $oCriteria->addSelectColumn( \ContentPeer::CON_VALUE ); + $oCriteria->add( \DynaformPeer::PRO_UID, $proUid ); + $oCriteria->add( \DynaformPeer::DYN_TYPE, "xmlform" ); + $oCriteria->add( \ContentPeer::CON_CATEGORY, 'DYN_TITLE'); + $oCriteria->add( \ContentPeer::CON_LANG, SYS_LANG); + $oCriteria->addJoin( \DynaformPeer::DYN_UID, \ContentPeer::CON_ID, \Criteria::INNER_JOIN); + $oDataset = \DynaformPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC ); + + while ($oDataset->next()) { + $dataForms = $oDataset->getRow(); + $dynHandler = new \dynaFormHandler(PATH_DYNAFORM . $proUid . PATH_SEP . $dataForms["DYN_UID"] . ".xml"); + $dynFields = $dynHandler->getFields(); + foreach ($dynFields as $field) { + $sType = \Step::getAttribute( $field, 'type' ); + if ($sType == 'grid') { + $sxmlgrid = \Step::getAttribute( $field, 'xmlgrid' ); + $aGridInfo = explode( "/", $sxmlgrid ); + if ($aGridInfo[0] == $proUid && $aGridInfo[1] == $dynUid) { + $formsDepend[] = $dataForms["CON_VALUE"]; + } + } + } } - } catch (\Exception $e) { - throw $e; + if (!empty($formsDepend)) { + $message = "You can not delete the grid '$dynUid', because it is in the "; + $message .= (count($formsDepend) == 1) ? 'form' : 'forms'; + $message .= ': ' . implode(', ', $formsDepend); + return $message; + } + } else { + $flagDepend = false; + $stepsDepends = \Step::verifyDynaformAssigStep($dynUid, $proUid); + + $messageSteps = '(0) Depends in steps'; + if (!empty($stepsDepends)) { + $flagDepend = true; + $countSteps = count($stepsDepends); + $messTemp = ''; + foreach ($stepsDepends as $value) { + $messTemp .= ", the task '" . $value['CON_VALUE'] . "' position " . $value['STEP_POSITION']; + } + $messageSteps = "($countSteps) Depends in steps in" . $messTemp; + } + + $stepSupervisorsDepends = \StepSupervisor::verifyDynaformAssigStepSupervisor($dynUid, $proUid); + $messageStepsSupervisors = '(0) Depends in steps supervisor'; + if (!empty($stepSupervisorsDepends)) { + $flagDepend = true; + $countSteps = count($stepSupervisorsDepends); + $messageStepsSupervisors = "($countSteps) Depends in steps supervisor"; + } + + $objectPermissionDepends = \ObjectPermission::verifyDynaformAssigObjectPermission($dynUid, $proUid); + $messageObjectPermission = '(0) Depends in permissions'; + if (!empty($objectPermissionDepends)) { + $flagDepend = true; + $countSteps = count($objectPermissionDepends); + $messageObjectPermission = "($countSteps) Depends in permissions"; + } + + $caseTrackerDepends = \CaseTrackerObject::verifyDynaformAssigCaseTracker($dynUid, $proUid); + $messageCaseTracker = '(0) Depends in case traker'; + if (!empty($caseTrackerDepends)) { + $flagDepend = true; + $countSteps = count($caseTrackerDepends); + $messageCaseTracker = "($countSteps) Depends in case traker"; + } + + if ($flagDepend) { + $message = "You can not delete the dynaform '$dynUid', because it has the following dependencies: \n\n"; + $message .= $messageSteps . ".\n" . $messageStepsSupervisors . ".\n"; + $message .= $messageObjectPermission . ".\n" . $messageCaseTracker; + return $message; + } + return ''; } } @@ -167,9 +246,7 @@ class DynaForm { try { $stepSupervisor = new \StepSupervisor(); - $arrayData = $stepSupervisor->loadInfo($dynaFormUid); - if (is_array($arrayData)) { return true; } else { @@ -381,9 +458,10 @@ class DynaForm $processUid = $arrayDynaFormData["PRO_UID"]; - //Verify data - if ($this->dynaFormAssignedStep($dynaFormUid, $processUid)) { - throw (new \Exception("You cannot delete this Dynaform while it is assigned to a step")); + //Verify dependencies dynaforms + $resultDependeds = $this->dynaFormDepends($dynaFormUid, $processUid); + if ($resultDependeds != '') { + throw (new \Exception($resultDependeds)); } //Delete