From 74bf8de07f4c12cd905f341c2871fa8ad2bdbf19 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Wed, 29 Jun 2016 10:17:06 -0400 Subject: [PATCH 1/3] HOR-1298 --- workflow/engine/controllers/home.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/controllers/home.php b/workflow/engine/controllers/home.php index 1b19c9fdf..5815fb00e 100755 --- a/workflow/engine/controllers/home.php +++ b/workflow/engine/controllers/home.php @@ -340,7 +340,7 @@ class Home extends Controller $dateFrom = null, $dateTo = null, $callback = null, - $dir = null, + $dir = 'DESC', $sort = "APP_CACHE_VIEW.APP_NUMBER", $category = null) { From 00a4022d6f2187be04a9c6c336af9e202aa6e4f1 Mon Sep 17 00:00:00 2001 From: Gustavo Adolfo Cruz Laura Date: Thu, 16 Jun 2016 18:10:18 -0400 Subject: [PATCH 2/3] HOR-1317: Adding support for plugin extensions for the granular import and export. --- .../engine/classes/class.pluginRegistry.php | 23 +++++++ workflow/engine/config/system-tables.ini | 1 + .../BusinessModel/Migrator/ExportObjects.php | 64 +++++++++++++------ .../Migrator/GranularExporter.php | 5 +- .../Migrator/GranularImporter.php | 59 ++++++++++++++--- .../Migrator/MigratorFactory.php | 3 + .../BusinessModel/Migrator/PMXGenerator.php | 6 +- .../Migrator/PluginMigratorAdapter.php | 60 +++++++++++++++++ .../Migrator/ProcessDefinitionMigrator.php | 2 - .../src/ProcessMaker/Importer/Importer.php | 2 +- workflow/engine/templates/processes/main.js | 2 +- 11 files changed, 191 insertions(+), 36 deletions(-) create mode 100644 workflow/engine/config/system-tables.ini create mode 100644 workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PluginMigratorAdapter.php diff --git a/workflow/engine/classes/class.pluginRegistry.php b/workflow/engine/classes/class.pluginRegistry.php index 36c6b5f91..77a98d68b 100755 --- a/workflow/engine/classes/class.pluginRegistry.php +++ b/workflow/engine/classes/class.pluginRegistry.php @@ -1789,5 +1789,28 @@ class PMPluginRegistry return $this->_aOpenReassignCallback; } + + public function getPluginsData() + { + return $this->_aPlugins; + } + + /** + * The following function method extracts the plugin if exists one + * with the same uppercase characters, this is required for the + * + * @param $code + */ + public function getPluginByCode($code) + { + $plugin = false; + foreach ($this->_aPlugins as $plugin) { + $plugin = (array)$plugin; + if (strtoupper($plugin['sNamespace']) == $code) { + return (object)$plugin; + } + } + return $plugin; + } } diff --git a/workflow/engine/config/system-tables.ini b/workflow/engine/config/system-tables.ini new file mode 100644 index 000000000..396df9e8b --- /dev/null +++ b/workflow/engine/config/system-tables.ini @@ -0,0 +1 @@ +tables = 'APPLICATION|APP_SEQUENCE|APP_DELEGATION|APP_DOCUMENT|APP_MESSAGE|APP_OWNER|CONFIGURATION|CONTENT|DEPARTMENT|DYNAFORM|GROUPWF|GROUP_USER|HOLIDAY|INPUT_DOCUMENT|ISO_COUNTRY|ISO_LOCATION|ISO_SUBDIVISION|LANGUAGE|LEXICO|OUTPUT_DOCUMENT|PROCESS|PROCESS_OWNER|REPORT_TABLE|REPORT_VAR|ROUTE|STEP|STEP_TRIGGER|SWIMLANES_ELEMENTS|TASK|TASK_USER|TRANSLATION|TRIGGERS|USERS|APP_THREAD|APP_DELAY|PROCESS_USER|SESSION|DB_SOURCE|STEP_SUPERVISOR|OBJECT_PERMISSION|CASE_TRACKER|CASE_TRACKER_OBJECT|CASE_CONSOLIDATED|STAGE|SUB_PROCESS|SUB_APPLICATION|LOGIN_LOG|USERS_PROPERTIES|ADDITIONAL_TABLES|FIELDS|SHADOW_TABLE|EVENT|GATEWAY|APP_EVENT|APP_CACHE_VIEW|DIM_TIME_DELEGATE|DIM_TIME_COMPLETE|APP_HISTORY|APP_FOLDER|FIELD_CONDITION|LOG_CASES_SCHEDULER|CASE_SCHEDULER|CALENDAR_DEFINITION|CALENDAR_BUSINESS_HOURS|CALENDAR_HOLIDAYS|CALENDAR_ASSIGNMENTS|PROCESS_CATEGORY|APP_NOTES|DASHLET|DASHLET_INSTANCE|APP_SOLR_QUEUE|SEQUENCES|SESSION_STORAGE|PROCESS_FILES|WEB_ENTRY|OAUTH_ACCESS_TOKENS|OAUTH_AUTHORIZATION_CODES|OAUTH_CLIENTS|OAUTH_REFRESH_TOKENS|OAUTH_SCOPES|PMOAUTH_USER_ACCESS_TOKENS|BPMN_PROJECT|BPMN_PROCESS|BPMN_ACTIVITY|BPMN_ARTIFACT|BPMN_DIAGRAM|BPMN_BOUND|BPMN_DATA|BPMN_EVENT|BPMN_FLOW|BPMN_GATEWAY|BPMN_LANESET|BPMN_LANE|BPMN_PARTICIPANT|BPMN_EXTENSION|BPMN_DOCUMENTATION|PROCESS_VARIABLES|APP_TIMEOUT_ACTION_EXECUTED|ADDONS_STORE|ADDONS_MANAGER|LICENSE_MANAGER|APP_ASSIGN_SELF_SERVICE_VALUE|LIST_INBOX|LIST_PARTICIPATED_HISTORY|LIST_PARTICIPATED_LAST|LIST_COMPLETED|LIST_PAUSED|LIST_CANCELED|LIST_MY_INBOX|LIST_UNASSIGNED|LIST_UNASSIGNED_GROUP|MESSAGE_TYPE|MESSAGE_TYPE_VARIABLE|EMAIL_SERVER|WEB_ENTRY_EVENT|MESSAGE_EVENT_DEFINITION|MESSAGE_EVENT_RELATION|MESSAGE_APPLICATION|ELEMENT_TASK_RELATION|ABE_CONFIGURATION|ABE_REQUESTS|ABE_RESPONSES|USR_REPORTING|PRO_REPORTING|DASHBOARD|DASHBOARD_INDICATOR|DASHBOARD_DAS_IND|CATALOG|SCRIPT_TASK|TIMER_EVENT|EMAIL_EVENT|NOTIFICATION_DEVICE|GMAIL_RELABELING|RBAC_PERMISSIONS|RBAC_ROLES|RBAC_ROLES_PERMISSIONS|RBAC_SYSTEMS|RBAC_USERS|RBAC_USERS_ROLES|RBAC_AUTHENTICATION_SOURCE|' diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/ExportObjects.php b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/ExportObjects.php index 92e21f489..1dc10d426 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/ExportObjects.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/ExportObjects.php @@ -7,22 +7,31 @@ class ExportObjects * @var array */ protected $objectsList = array( - 'Process Definition', - 'Assignment Rules', - 'Variables', - 'Dynaforms', - 'Input Documents', - 'Output Documents', - 'Triggers', - 'Report Tables', - 'Templates', - 'Files', - 'DB Connection', - 'Permissions', - 'Supervisors', - 'Supervisors Objects' + 'PROCESSDEFINITION' => 'Process Definition', + 'ASSIGNMENTRULES' => 'Assignment Rules', + 'VARIABLES' => 'Variables', + 'DYNAFORMS' => 'Dynaforms', + 'INPUTDOCUMENTS' => 'Input Documents', + 'OUTPUTDOCUMENTS' => 'Output Documents', + 'TRIGGERS' => 'Triggers', + 'REPORTTABLES' => 'Report Tables', + 'TEMPLATES' => 'Templates', + 'FILES' => 'Files', + 'DBCONNECTION' => 'DB Connection', + 'PERMISSIONS' => 'Permissions', + 'SUPERVISORS' => 'Supervisors', + 'SUPERVISORSOBJECTS' => 'Supervisors Objects' ); + /** + * ExportObjects constructor. + */ + public function __construct() + { + $this->objectsList = array_merge($this->objectsList, $this->processMigrablePlugins()); + } + + /** * @return array */ @@ -51,13 +60,12 @@ class ExportObjects $aObjectsEnable = explode('|', $objectsEnable); foreach ($this->objectsList as $key => $val) { $grid[] = array( - 'OBJECT_ID' => $key+1, + 'OBJECT_ID' => strtoupper(str_replace(' ', '',$val)), 'OBJECT_NAME' => $val, 'OBJECT_ACTION' => 1, 'OBJECT_ENABLE' => in_array(strtoupper(str_replace(' ', '',$val)), $aObjectsEnable) ); } - $r = new \stdclass(); $r->data = $grid; @@ -67,6 +75,21 @@ class ExportObjects } } + public function processMigrablePlugins() + { + \G::LoadClass("pluginRegistry"); + $plugins = array(); + $registry = \PMPluginRegistry::getSingleton(); + $data = $registry->getPluginsData(); + foreach ($data as $detail) { + $detail = (array)$detail; + if (isset($detail['bIsMigrable']) && $detail['bIsMigrable']) { + $plugins[strtoupper($detail['sNamespace'])] = $detail['sNamespace']; + } + } + return $plugins; + } + /** * @param $idObject * @return mixed @@ -75,7 +98,7 @@ class ExportObjects public function getObjectName($idObject) { try { - return (str_replace(' ', '', $this->objectsList[$idObject - 1])); + return (str_replace(' ', '', $this->objectsList[$idObject])); } catch (\Exception $e) { throw $e; @@ -92,7 +115,7 @@ class ExportObjects try { $mapObjectList = array(); foreach ($objects as $objectId) { - array_push($mapObjectList, strtoupper(str_replace(' ', '', $this->objectsList[$objectId - 1]))); + array_push($mapObjectList, strtoupper(str_replace(' ', '', $this->objectsList[$objectId]))); } return $mapObjectList; } catch (\Exception $e) { @@ -110,10 +133,9 @@ class ExportObjects try { $idObjectList = array(); foreach ($this->objectsList as $key => $val) { - $key++; foreach ($objects as $row) { - if(strtoupper(str_replace(' ', '', $this->objectsList[$key - 1])) === $row){ - array_push($idObjectList, $key); + if(strtoupper(str_replace(' ', '', $this->objectsList[$key])) === $row){ + array_push($idObjectList, $row); } } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/GranularExporter.php b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/GranularExporter.php index 7fae7c274..8d67b5b2f 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/GranularExporter.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/GranularExporter.php @@ -39,8 +39,10 @@ class GranularExporter $this->beforeExport($objectList); foreach ($objectList as $data) { $migrator = $this->factory->create($data); + $migrator->beforeExport(); $migratorData = $migrator->export($this->prjuid); $this->mergeData($migratorData); + $migrator->afterExport(); } return $this->publish(); } else { @@ -121,7 +123,8 @@ class GranularExporter $data = array( 'bpmn-definition' => $bpnmDefinition, 'workflow-definition' => $workflowDefinition, - 'workflow-files' => [] + 'workflow-files' => [], + 'plugin-data' => [] ); $data["filename"] = $outputFilename; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/GranularImporter.php b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/GranularImporter.php index adf550b43..164210bb3 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/GranularImporter.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/GranularImporter.php @@ -36,8 +36,16 @@ class GranularImporter $this->exportObjects = new ExportObjects(); //create structure foreach ($aGranular as $key => $rowObject) { - array_push($listObjectGranular, array("name" => strtoupper($this->exportObjects->getObjectName - ($rowObject->id)), "data" => "", "value" => $rowObject->action)); + array_push( + $listObjectGranular, + array( + "name" => strtoupper( + $this->exportObjects->getObjectName($rowObject->id) + ), + "data" => [], + "value" => $rowObject->action + ) + ); } //add data foreach ($listObjectGranular as $key => $rowObject) { @@ -57,9 +65,9 @@ class GranularImporter switch ($nameObject) { case 'PROCESSDEFINITION': $objectList['PROCESSDEFINITION']['bpmn'] = isset($data['tables']['bpmn']) ? $this->structureBpmnData - ($data['tables']['bpmn']) : ''; + ($data['tables']['bpmn']) : []; $objectList['PROCESSDEFINITION']['workflow'] = isset($data['tables']['workflow']) ? - $data['tables']['workflow'] : ''; + $data['tables']['workflow'] : []; break; case 'ASSIGNMENTRULES': $objectList['ASSIGNMENTRULES']['tasks'] = isset($data['tables']['workflow']['tasks']) ? @@ -127,6 +135,8 @@ class GranularImporter $data['tables']['workflow']['reportTablesFields'] : []; break; default: + $objectList[$nameObject] = isset($data['tables']['plugins'][strtolower($nameObject)]) ? + $data['tables']['plugins'][strtolower($nameObject)] : ''; break; } return $objectList; @@ -170,7 +180,9 @@ class GranularImporter if (is_object($objClass)) { $dataImport = $data['data'][$data['name']]; $replace = ($data['value'] == 'replace') ? true : false; + $objClass->beforeImport($dataImport); $migratorData = $objClass->import($dataImport, $replace); + $objClass->afterImport($dataImport); } } } else { @@ -201,10 +213,34 @@ class GranularImporter { try { if (XmlImporter::IMPORT_OPTION_OVERWRITE !== $option) { - if (count($objectList) !== count($this->exportObjects->getObjectsList())) { - $exception = new ImportException(); - $exception->setNameException(\G::LoadTranslation('ID_PROCESS_DEFINITION_INCOMPLETE')); - throw($exception); + $nativeElements = array( + 'PROCESSDEFINITION', + 'ASSIGNMENTRULES', + 'VARIABLES', + 'DYNAFORMS', + 'INPUTDOCUMENTS', + 'OUTPUTDOCUMENTS', + 'TRIGGERS', + 'REPORTTABLES', + 'TEMPLATES', + 'FILES', + 'DBCONNECTION', + 'PERMISSIONS', + 'SUPERVISORS', + 'SUPERVISORSOBJECTS' + ); + foreach ($nativeElements as $element) { + $found = false; + foreach($objectList as $object) { + if ($element == $object->id) { + $found = true; + } + } + if (!$found) { + $exception = new ImportException(); + $exception->setNameException(\G::LoadTranslation('ID_PROCESS_DEFINITION_INCOMPLETE')); + throw($exception); + } } } return true; @@ -215,7 +251,7 @@ class GranularImporter /** * It's very important to import the elements in the right order, if not - * chaos will be unleashed, God forgive us all. + * some strange behavior will occur during import and export. * @param $objectList */ public function reorderImportOrder($objectList) @@ -242,6 +278,10 @@ class GranularImporter $orderedList[$executionOrder] = $objectList[$objectOrder]; } } + + for ($j=count($arrangeList); $jupdateDataUidByArrayUid($arrayWorkflowTables, $arrayWorkflowFiles, $result); } $newData['tables']['workflow'] = $arrayWorkflowTables; + $newData['tables']['plugins'] = $data["tables"]["plugins"]; $newData['files']['workflow'] = $arrayWorkflowFiles; return array( diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/MigratorFactory.php b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/MigratorFactory.php index 81ed05bae..bb152856c 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/MigratorFactory.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/MigratorFactory.php @@ -52,6 +52,9 @@ class MigratorFactory case 'PERMISSIONS': $class = new PermissionsMigrator(); break; + default: + $class = new PluginMigratorAdapter($classname); + break; } return $class; } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PMXGenerator.php b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PMXGenerator.php index 03c2a780f..acc2ee384 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PMXGenerator.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PMXGenerator.php @@ -56,7 +56,11 @@ class PMXGenerator $rootNode->appendChild($metadataNode); - $dbData = array("BPMN" => $data["bpmn-definition"], "workflow" => $data["workflow-definition"]); + $dbData = array( + "BPMN" => $data["bpmn-definition"], + "workflow" => $data["workflow-definition"], + "plugins" => $data["plugin-data"] + ); foreach ($dbData as $sectionName => $sectionData) { $dataNode = $this->domDocument->createElement("definition"); $dataNode->setAttribute("class", $sectionName); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PluginMigratorAdapter.php b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PluginMigratorAdapter.php new file mode 100644 index 000000000..7bb971e17 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/PluginMigratorAdapter.php @@ -0,0 +1,60 @@ +getPluginByCode($pluginName); + require_once ( + PATH_PLUGINS.PATH_SEP. + $plugin->sPluginFolder.PATH_SEP. + 'classes'.PATH_SEP. + $plugin->sMigratorClassName.'.php' + ); + $this->migrator = new $plugin->sMigratorClassName(); + } + + public function beforeExport() + { + return $this->migrator->beforeExport(); + } + + public function export($prj_uid) + { + return $this->migrator->export($prj_uid); + } + + public function afterExport() + { + return $this->migrator->afterExport(); + } + + public function beforeImport($data) + { + return $this->migrator->beforeImport($data); + } + + public function import($data, $replace) + { + return $this->migrator->import($data, $replace); + } + + public function afterImport($data) + { + return $this->migrator->afterImport($data); + } + +} \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/ProcessDefinitionMigrator.php b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/ProcessDefinitionMigrator.php index 571903dfe..dc2ba7944 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/ProcessDefinitionMigrator.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Migrator/ProcessDefinitionMigrator.php @@ -37,8 +37,6 @@ class ProcessDefinitionMigrator implements Importable, Exportable //Bpmn elements $pjrUid = $this->bpmn->createFromStruct($data['bpmn'], false); //Import workflow elements - $this->afterImport($data); - } catch (\Exception $e) { $exception = new ImportException($e->getMessage()); $exception->setNameException($this->className); diff --git a/workflow/engine/src/ProcessMaker/Importer/Importer.php b/workflow/engine/src/ProcessMaker/Importer/Importer.php index 8ca49dca3..1b8d8cc3b 100755 --- a/workflow/engine/src/ProcessMaker/Importer/Importer.php +++ b/workflow/engine/src/ProcessMaker/Importer/Importer.php @@ -242,7 +242,7 @@ abstract class Importer $newObjectArray = array(); $count = 0; foreach ($objectsToImport as $key => $rowObject) { - if($rowObject->id != '1'){ + if($rowObject->id != 'PROCESSDEFINITION'){ $newObjectArray[++$count] = $rowObject; } } diff --git a/workflow/engine/templates/processes/main.js b/workflow/engine/templates/processes/main.js index f4a34e4c7..6ef077c15 100755 --- a/workflow/engine/templates/processes/main.js +++ b/workflow/engine/templates/processes/main.js @@ -1184,7 +1184,7 @@ function exportImportProcessObjects(typeAction) if(!inArray(row.get('OBJECT_ID'),importProcessGlobal.objectGranularImport)) { store.remove(row); } - if(row.get('OBJECT_ID') === 1) { /*process definition*/ + if(row.get('OBJECT_ID') === "PROCESSDEFINITION") { /*process definition*/ row.set("OBJECT_ACTION","2"); } }); From 51d4ea460d3029303b5d942689a05c53a7d088a1 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Thu, 30 Jun 2016 09:31:34 -0400 Subject: [PATCH 3/3] HOR-1377 --- workflow/engine/classes/class.case.php | 10 ++++++++-- workflow/engine/classes/class.derivation.php | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index 5ab23f325..eebbd058d 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -1541,6 +1541,10 @@ class Cases //If exist paused cases $closedTasks[] = $row; $aIndex[] = $row['DEL_INDEX']; + $res = $this->GetAllOpenDelegation( array('APP_UID'=>$sAppUid, 'APP_THREAD_PARENT'=>$row['DEL_PREVIOUS']), 'NONE' ); + foreach ($res as $in) { + $aIndex[] = $in['DEL_INDEX']; + } $pausedTasks = $this->getReviewedTasksPaused($sAppUid,$aIndex); } } @@ -7094,14 +7098,16 @@ class Cases * @return $aThreads */ - public function GetAllOpenDelegation($aData) + public function GetAllOpenDelegation($aData, $status = 'OPEN') { try { $aThreads = array(); $c = new Criteria(); $c->add(AppDelegationPeer::APP_UID, $aData['APP_UID']); $c->add(AppDelegationPeer::DEL_PREVIOUS, $aData['APP_THREAD_PARENT']); - $c->add(AppDelegationPeer::DEL_THREAD_STATUS, 'OPEN'); + if($status === 'OPEN'){ + $c->add(AppDelegationPeer::DEL_THREAD_STATUS, 'OPEN'); + } $rs = AppDelegationPeer::doSelectRs($c); $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); $rs->next(); diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index e232a71cd..b7d5b0550 100755 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -1169,6 +1169,10 @@ class Derivation if(isset($nextDel["ROU_PREVIOUS_TYPE"])){ if($nextDel["ROU_PREVIOUS_TYPE"] == "SEC-JOIN"){ $arrayOpenThread = $this->case->searchOpenPreviousTasks($nextDel["ROU_PREVIOUS_TASK"], $currentDelegation["APP_UID"]); + $arraySiblings = $this->case->getOpenSiblingThreads($nextDel["ROU_PREVIOUS_TASK"], $currentDelegation["APP_UID"], $currentDelegation["DEL_INDEX"], $currentDelegation["TAS_UID"]); + if(is_array($arrayOpenThread) && is_array($arraySiblings)){ + $arrayOpenThread = array_merge($arrayOpenThread, $arraySiblings); + } $canDerivate = empty($arrayOpenThread); } }