diff --git a/workflow/engine/src/ProcessMaker/Importer/Importer.php b/workflow/engine/src/ProcessMaker/Importer/Importer.php index 0614e1364..da2406473 100755 --- a/workflow/engine/src/ProcessMaker/Importer/Importer.php +++ b/workflow/engine/src/ProcessMaker/Importer/Importer.php @@ -174,11 +174,27 @@ abstract class Importer /*----------------------------------********---------------------------------*/ if($objectsToImport === ''){ /*----------------------------------********---------------------------------*/ + try { + $this->verifyIfTheProcessHasStartedCases(); + } catch (\Exception $e) { + throw $e; + } $this->removeProject(); /*----------------------------------********---------------------------------*/ } else { $granularObj = new \ProcessMaker\BusinessModel\Migrator\GranularImporter(); $objectList = $granularObj->loadObjectsListSelected($this->importData, $objectsToImport); + try { + foreach ($objectList as $rowObject) { + if ($rowObject['name'] === 'PROCESSDEFINITION') { + $this->verifyIfTheProcessHasStartedCases(); + } + } + } catch (\Exception $e) { + $exception = new ImportException($e->getMessage()); + $exception->setNameException($e->getMessage()); + throw $exception; + } try { foreach ($objectList as $rowObject) { if ($rowObject['name'] === 'PROCESSDEFINITION') { @@ -351,6 +367,46 @@ abstract class Importer $project->remove(true, false, $onlyDiagram); } + /** + * Check tasks that have cases. + * + * @return boolean + */ + public function verifyIfTheProcessHasStartedCases() + { + $tasksIds = array(); + $importedTasks = $this->importData["tables"]["workflow"]["tasks"]; + foreach ($importedTasks as $value) { + $tasksIds[] = $value["TAS_UID"]; + } + + $criteria = new \Criteria("workflow"); + $criteria->addSelectColumn(\TaskPeer::TAS_UID); + $criteria->add(\TaskPeer::PRO_UID, $this->metadata["uid"], \Criteria::EQUAL); + $criteria->add(\TaskPeer::TAS_UID, $tasksIds, \Criteria::NOT_IN); + $ds = \TaskPeer::doSelectRS($criteria); + $ds->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $tasksEliminatedIds = array(); + while ($ds->next()) { + $row = $ds->getRow(); + $tasksEliminatedIds[] = $row["TAS_UID"]; + } + + $criteria = new \Criteria("workflow"); + $criteria->addSelectColumn(\AppDelegationPeer::TAS_UID); + $criteria->add(\AppDelegationPeer::PRO_UID, $this->metadata["uid"], \Criteria::EQUAL); + $criteria->add(\AppDelegationPeer::DEL_FINISH_DATE, null, \Criteria::ISNULL); + $criteria->add(\AppDelegationPeer::TAS_UID, $tasksEliminatedIds, \Criteria::IN); + $ds = \AppDelegationPeer::doSelectRS($criteria); + $ds->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $ds->next(); + $row = $ds->getRow(); + if (isset($row["TAS_UID"])) { + $exception = new \Exception(\G::LoadTranslation("ID_PROCESS_CANNOT_BE_UPDATED_THERE_ARE_TASKS_WITH_ACTIVE_CASES")); + throw $exception; + } + } + /** * Sets the temporal file save directory * @param $dirName