diff --git a/workflow/engine/classes/class.pmFunctions.php b/workflow/engine/classes/class.pmFunctions.php index ac2a8b223..51bbdbcc6 100755 --- a/workflow/engine/classes/class.pmFunctions.php +++ b/workflow/engine/classes/class.pmFunctions.php @@ -305,9 +305,9 @@ function executeQuery ($SqlStatement, $DBConnectionUID = 'workflow', $aParameter * @label order Grid * @link http://wiki.processmaker.com/index.php/ProcessMaker_Functions#orderGrid.28.29 * - * @param array | $dataM | User ID | A grid, which is a numbered array containing associative arrays with field names and their values, it has to be set like this "@=". + * @param array | $dataM | Grid Name | A grid, which is a numbered array containing associative arrays with field names and their values, it has to be set like this "@=". * @param string(32) | $field | Name of field | The name of the field by which the grid will be sorted. - * @param string(32) | $ord = "ASC"| Optional parameter | Optional parameter. The order which can either be 'ASC' (ascending) or 'DESC' (descending). If not included, 'ASC' will be used by default. + * @param string(32) | $ord = "ASC"| Optional parameter (Criteria) | Optional parameter. The order which can either be 'ASC' (ascending) or 'DESC' (descending). If not included, 'ASC' will be used by default. * @return array | $dataM | Grid Sorted | Grid sorted * */ diff --git a/workflow/engine/classes/model/StepSupervisor.php b/workflow/engine/classes/model/StepSupervisor.php index 77eb769b3..397f7ed74 100755 --- a/workflow/engine/classes/model/StepSupervisor.php +++ b/workflow/engine/classes/model/StepSupervisor.php @@ -171,6 +171,29 @@ class StepSupervisor extends BaseStepSupervisor } } + /** + * Get the next position for a atep + * + * @param string $sProcessUID + * @return integer + * + */ + public function getNextPositionAll ($sProcessUID) + { + try { + $oCriteria = new Criteria( 'workflow' ); + $oCriteria->addSelectColumn( '(COUNT(*) + 1) AS POSITION' ); + $oCriteria->add( StepSupervisorPeer::PRO_UID, $sProcessUID ); + $oDataset = StepSupervisorPeer::doSelectRS( $oCriteria ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $oDataset->next(); + $aRow = $oDataset->getRow(); + return (int) $aRow['POSITION']; + } catch (Exception $oException) { + throw $Exception; + } + } + /** * Reorder the steps positions * diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ProcessSupervisor.php b/workflow/engine/src/ProcessMaker/BusinessModel/ProcessSupervisor.php index ba20b1389..78954a505 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/ProcessSupervisor.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ProcessSupervisor.php @@ -306,7 +306,8 @@ class ProcessSupervisor $aResp[] = array('pud_uid' => $aRow['STEP_UID'], 'pud_position' => $aRow['STEP_POSITION'], 'dyn_uid' => $aRow['STEP_UID_OBJ'], - 'dyn_title' => $aRow['DYN_TITLE']); + 'dyn_title' => $aRow['DYN_TITLE'], + 'obj_type' => "DYNAFORM"); $oDataset->next(); } return $aResp; @@ -370,6 +371,178 @@ class ProcessSupervisor } } + /** + * Return available dynaform supervisor + * @param string $sProcessUID + * + * @return array + * + * @access public + */ + public function getAvailableProcessSupervisorDynaformInputDocument($sProcessUID = '') + { + $arrayProcessSupervisorsObject = array(); + + try { + $aResp = array(); + $oCriteria = $this->getProcessSupervisorDynaforms($sProcessUID); + $aUIDS = array(); + foreach ($oCriteria as $oCriteria => $value) { + $aUIDS[] = $value["dyn_uid"]; + } + $sDelimiter = \DBAdapter::getStringDelimiter(); + $oCriteria = new \Criteria('workflow'); + $oCriteria->addSelectColumn(\DynaformPeer::DYN_UID); + $oCriteria->addSelectColumn(\DynaformPeer::PRO_UID); + $oCriteria->addAsColumn('DYN_TITLE', 'C.CON_VALUE'); + $oCriteria->addAlias('C', 'CONTENT'); + $aConditions = array(); + $aConditions[] = array(\DynaformPeer::DYN_UID, 'C.CON_ID'); + $aConditions[] = array('C.CON_CATEGORY', $sDelimiter . 'DYN_TITLE' . $sDelimiter); + $aConditions[] = array('C.CON_LANG', $sDelimiter . SYS_LANG . $sDelimiter); + $oCriteria->addJoinMC($aConditions, \Criteria::LEFT_JOIN); + $oCriteria->add(\DynaformPeer::PRO_UID, $sProcessUID); + $oCriteria->add(\DynaformPeer::DYN_TYPE, 'xmlform'); + $oCriteria->add(\DynaformPeer::DYN_UID, $aUIDS, \Criteria::NOT_IN); + $oDataset = \StepSupervisorPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + $oDataset = \StepSupervisorPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $arrayProcessSupervisorsObject[] = array('dyn_uid' => $aRow['DYN_UID'], + 'dyn_title' => $aRow['DYN_TITLE'], + 'obj_uid' => $aRow['DYN_UID'], + 'obj_type' => "DYNAFORM"); + $oDataset->next(); + } + } catch (Exception $e) { + throw $e; + } + + try { + $oCriteria = $this->getProcessSupervisorInputDocuments($sProcessUID); + $aUIDS = array(); + foreach ($oCriteria as $oCriteria => $value) { + $aUIDS[] = $value["input_doc_uid"]; + } + $sDelimiter = \DBAdapter::getStringDelimiter(); + $oCriteria = new \Criteria('workflow'); + $oCriteria->addSelectColumn(\InputDocumentPeer::INP_DOC_UID); + $oCriteria->addSelectColumn(\InputDocumentPeer::PRO_UID); + $oCriteria->addAsColumn('INP_DOC_TITLE', 'C.CON_VALUE'); + $oCriteria->addAlias('C', 'CONTENT'); + $aConditions = array(); + $aConditions[] = array(\InputDocumentPeer::INP_DOC_UID, 'C.CON_ID'); + $aConditions[] = array('C.CON_CATEGORY', $sDelimiter . 'INP_DOC_TITLE' . $sDelimiter); + $aConditions[] = array('C.CON_LANG', $sDelimiter . SYS_LANG . $sDelimiter); + $oCriteria->addJoinMC($aConditions, \Criteria::LEFT_JOIN); + $oCriteria->add(\InputDocumentPeer::PRO_UID, $sProcessUID); + $oCriteria->add(\InputDocumentPeer::INP_DOC_UID, $aUIDS, \Criteria::NOT_IN); + $oDataset = \StepSupervisorPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + $oDataset = \StepSupervisorPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $arrayProcessSupervisorsObject[] = array('inp_doc_uid' => $aRow['INP_DOC_UID'], + 'inp_doc_title' => $aRow['INP_DOC_TITLE'], + 'obj_uid' => $aRow['INP_DOC_UID'], + 'obj_type'=>"INPUT-DOCUMENT"); + $oDataset->next(); + } + return $arrayProcessSupervisorsObject; + } catch (Exception $e) { + throw $e; + } + } + + public function getProcessSupervisorDynaformsInputsDocuments($sProcessUID = '') + { + $arrayProcessSupervisorsAssignedObject = array(); + + try { + $sDelimiter = \DBAdapter::getStringDelimiter(); + $oCriteria = new \Criteria('workflow'); + $oCriteria->addSelectColumn(\StepSupervisorPeer::STEP_UID); + $oCriteria->addSelectColumn(\StepSupervisorPeer::PRO_UID); + $oCriteria->addSelectColumn(\StepSupervisorPeer::STEP_TYPE_OBJ); + $oCriteria->addSelectColumn(\StepSupervisorPeer::STEP_UID_OBJ); + $oCriteria->addSelectColumn(\StepSupervisorPeer::STEP_POSITION); + $oCriteria->addAsColumn('DYN_TITLE', 'C.CON_VALUE'); + $oCriteria->addAlias('C', 'CONTENT'); + $aConditions = array(); + $aConditions[] = array(\StepSupervisorPeer::STEP_UID_OBJ, \DynaformPeer::DYN_UID ); + $aConditions[] = array(\StepSupervisorPeer::STEP_TYPE_OBJ, $sDelimiter . 'DYNAFORM' . $sDelimiter ); + $oCriteria->addJoinMC($aConditions, \Criteria::LEFT_JOIN); + $aConditions = array(); + $aConditions[] = array(\DynaformPeer::DYN_UID, 'C.CON_ID' ); + $aConditions[] = array('C.CON_CATEGORY', $sDelimiter . 'DYN_TITLE' . $sDelimiter ); + $aConditions[] = array('C.CON_LANG', $sDelimiter . SYS_LANG . $sDelimiter ); + $oCriteria->addJoinMC($aConditions, \Criteria::LEFT_JOIN); + $oCriteria->add(\StepSupervisorPeer::PRO_UID, $sProcessUID); + $oCriteria->add(\StepSupervisorPeer::STEP_TYPE_OBJ, 'DYNAFORM'); + $oCriteria->addAscendingOrderByColumn(\StepSupervisorPeer::STEP_POSITION); + $oDataset = \StepSupervisorPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $arrayProcessSupervisorsAssignedObject[] = array('pud_uid' => $aRow['STEP_UID'], + 'pud_position' => $aRow['STEP_POSITION'], + 'dyn_uid' => $aRow['STEP_UID_OBJ'], + 'dyn_title' => $aRow['DYN_TITLE'], + 'obj_title' => "", + 'obj_uid' => $aRow['STEP_UID_OBJ'], + 'obj_type' => "DYNAFORM"); + $oDataset->next(); + } + } catch (Exception $e) { + throw $e; + } + + try { + $sDelimiter = \DBAdapter::getStringDelimiter(); + $oCriteria = new \Criteria('workflow'); + $oCriteria->addSelectColumn(\StepSupervisorPeer::STEP_UID); + $oCriteria->addSelectColumn(\StepSupervisorPeer::PRO_UID); + $oCriteria->addSelectColumn(\StepSupervisorPeer::STEP_TYPE_OBJ); + $oCriteria->addSelectColumn(\StepSupervisorPeer::STEP_UID_OBJ); + $oCriteria->addSelectColumn(\StepSupervisorPeer::STEP_POSITION); + $oCriteria->addAsColumn('INP_DOC_TITLE', 'C.CON_VALUE'); + $oCriteria->addAlias('C', 'CONTENT'); + $aConditions = array(); + $aConditions[] = array(\StepSupervisorPeer::STEP_UID_OBJ, \InputDocumentPeer::INP_DOC_UID); + $aConditions[] = array(\StepSupervisorPeer::STEP_TYPE_OBJ, $sDelimiter . 'INPUT_DOCUMENT' . $sDelimiter); + $oCriteria->addJoinMC($aConditions, \Criteria::LEFT_JOIN); + $aConditions = array(); + $aConditions[] = array(\InputDocumentPeer::INP_DOC_UID, 'C.CON_ID'); + $aConditions[] = array('C.CON_CATEGORY', $sDelimiter . 'INP_DOC_TITLE' . $sDelimiter); + $aConditions[] = array('C.CON_LANG', $sDelimiter . SYS_LANG . $sDelimiter); + $oCriteria->addJoinMC($aConditions, \Criteria::LEFT_JOIN); + $oCriteria->add(\StepSupervisorPeer::PRO_UID, $sProcessUID); + $oCriteria->add(\StepSupervisorPeer::STEP_TYPE_OBJ, 'INPUT_DOCUMENT'); + $oCriteria->addAscendingOrderByColumn(\StepSupervisorPeer::STEP_POSITION); + $oDataset = \StepSupervisorPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $arrayProcessSupervisorsAssignedObject[] = array('pui_uid' => $aRow['STEP_UID'], + 'pui_position' => $aRow['STEP_POSITION'], + 'input_doc_uid' => $aRow['STEP_UID_OBJ'], + 'input_doc_title' => $aRow['INP_DOC_TITLE'], + 'obj_title' => "", + 'obj_uid' => $aRow['STEP_UID_OBJ'], + 'obj_type' => "INPUT-DOCUMENT"); + $oDataset->next(); + } + return $arrayProcessSupervisorsAssignedObject; + } catch (Exception $e) { + throw $e; + } + } + /** * Return available dynaform supervisor * @param string $sProcessUID @@ -409,7 +582,8 @@ class ProcessSupervisor $oDataset->next(); while ($aRow = $oDataset->getRow()) { $aResp[] = array('dyn_uid' => $aRow['DYN_UID'], - 'dyn_title' => $aRow['DYN_TITLE']); + 'dyn_title' => $aRow['DYN_TITLE'], + 'obj_type' => "DYNAFORM"); $oDataset->next(); } return $aResp; @@ -458,7 +632,8 @@ class ProcessSupervisor $aResp[] = array('pui_uid' => $aRow['STEP_UID'], 'pui_position' => $aRow['STEP_POSITION'], 'input_doc_uid' => $aRow['STEP_UID_OBJ'], - 'input_doc_title' => $aRow['INP_DOC_TITLE']); + 'input_doc_title' => $aRow['INP_DOC_TITLE'], + 'obj_type' => "INPUT_DOCUMENT"); $oDataset->next(); } return $aResp; @@ -560,7 +735,8 @@ class ProcessSupervisor $oDataset->next(); while ($aRow = $oDataset->getRow()) { $aResp[] = array('inp_doc_uid' => $aRow['INP_DOC_UID'], - 'inp_doc_title' => $aRow['INP_DOC_TITLE']); + 'inp_doc_title' => $aRow['INP_DOC_TITLE'], + 'obj_type'=>"INPUT_DOCUMENT"); $oDataset->next(); } return $aResp; @@ -691,7 +867,7 @@ class ProcessSupervisor $oStepSupervisor->create(array('PRO_UID' => $sProcessUID, 'STEP_TYPE_OBJ' => "DYNAFORM", 'STEP_UID_OBJ' => $sDynUID, - 'STEP_POSITION' => $oStepSupervisor->getNextPosition($sProcessUID, "DYNAFORM"))); + 'STEP_POSITION' => $oStepSupervisor->getNextPositionAll($sProcessUID))); $sDelimiter = \DBAdapter::getStringDelimiter(); $oCriteria = new \Criteria('workflow'); $oCriteria->addSelectColumn(\StepSupervisorPeer::STEP_UID); @@ -777,7 +953,7 @@ class ProcessSupervisor $oStepSupervisor->create(array('PRO_UID' => $sProcessUID, 'STEP_TYPE_OBJ' => "INPUT_DOCUMENT", 'STEP_UID_OBJ' => $sInputDocumentUID, - 'STEP_POSITION' => $oStepSupervisor->getNextPosition($sProcessUID, "INPUT_DOCUMENT"))); + 'STEP_POSITION' => $oStepSupervisor->getNextPositionAll($sProcessUID))); $sDelimiter = \DBAdapter::getStringDelimiter(); $oCriteria = new \Criteria('workflow'); $oCriteria->addSelectColumn(\StepSupervisorPeer::STEP_UID); @@ -901,7 +1077,7 @@ class ProcessSupervisor $actualPosition = $oCriteria->getStepPosition(); $tempPosition = (isset($sPudPosition)) ? $sPudPosition : $actualPosition; if (isset($tempPosition) && ($tempPosition != $actualPosition)) { - $this->moveDynaforms($sProcessUID, $sPudUID, $tempPosition); + $this->moveDyanformsInputDocuments($sProcessUID, $sPudUID, $tempPosition); } //Return unset($sPudPosition); @@ -914,6 +1090,8 @@ class ProcessSupervisor return $oCriteria; } + + /** * Assign a InputDocument supervisor of a process * @@ -928,7 +1106,7 @@ class ProcessSupervisor $actualPosition = $oCriteria->getStepPosition(); $tempPosition = (isset($sPuiPosition)) ? $sPuiPosition : $actualPosition; if (isset($tempPosition) && ($tempPosition != $actualPosition)) { - $this->moveInputDocuments($sProcessUID, $sPuiUID, $tempPosition); + $this->moveDyanformsInputDocuments($sProcessUID, $sPuiUID, $tempPosition); } //Return unset($sPuiPosition); @@ -941,6 +1119,71 @@ class ProcessSupervisor return $oCriteria; } + /** + * Validate Process Uid + * @var string $pro_uid. Uid for Process + * @var string $pu_uid. Uid for Step + * @var string $pu_pos. Position for Step + * + * @return void + */ + public function moveDyanformsInputDocuments($pro_uid, $pu_uid, $pu_pos) + { + $aSteps = $this->getProcessSupervisorDynaformsInputsDocuments($pro_uid); + $step_pos = $pu_pos; + $step_uid = $pu_uid; + foreach ($aSteps as $dataStep) { + if($dataStep['obj_type'] == 'DYNAFORM'){ + if ($dataStep['pud_uid'] == $step_uid) { + $prStepPos = (int)$dataStep['pud_position']; + } + }else{ + if ($dataStep['pui_uid'] == $step_uid) { + $prStepPos = (int)$dataStep['pui_position']; + } + } + } + $seStepPos = $step_pos; + //Principal Step is up + if ($prStepPos == $seStepPos) { + return true; + } elseif ($prStepPos < $seStepPos) { + $modPos = 'UP'; + $newPos = $seStepPos; + $iniPos = $prStepPos+1; + $finPos = $seStepPos; + } else { + $modPos = 'DOWN'; + $newPos = $seStepPos; + $iniPos = $seStepPos; + $finPos = $prStepPos-1; + } + $range = range($iniPos, $finPos); + foreach ($aSteps as $dataStep) { + if($dataStep['obj_type'] == 'DYNAFORM'){ + if ((in_array($dataStep['pud_position'], $range)) && ($dataStep['pud_uid'] != $step_uid)) { + $stepChangeIds[] = $dataStep['pud_uid']; + $stepChangePos[] = $dataStep['pud_position']; + } + }else{ + if ((in_array($dataStep['pui_position'], $range)) && ($dataStep['pui_uid'] != $step_uid)) { + $stepChangeIds[] = $dataStep['pui_uid']; + $stepChangePos[] = $dataStep['pui_position']; + } + } + } + foreach ($stepChangeIds as $key => $value) { + if ($modPos == 'UP') { + $tempPos = ((int)$stepChangePos[$key])-1; + $this ->changePosStep($value, $tempPos); + } else { + $tempPos = ((int)$stepChangePos[$key])+1; + $this ->changePosStep($value, $tempPos); + } + } + $this ->changePosStep($value, $tempPos); + } + /** * Validate Process Uid * @var string $pro_uid. Uid for Process diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessSupervisors.php b/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessSupervisors.php index cbfa0c796..51899a095 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessSupervisors.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessSupervisors.php @@ -90,6 +90,25 @@ class ProcessSupervisors extends Api return $response; } + /** + * @param string $prjUid {@min 32} {@max 32} + * + * @url GET /:prjUid/process-supervisor/assignmentsteps + */ + public function doGetProcessSupervisorAssignmentsteps($prjUid) + { + try { + $supervisor = new \ProcessMaker\BusinessModel\ProcessSupervisor(); + $arrayData = $supervisor->getProcessSupervisorDynaformsInputsDocuments($prjUid); + //Response + $response = $arrayData; + } catch (\Exception $e) { + //response + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + return $response; + } + /** * @param string $prjUid {@min 32} {@max 32} * @param string $pudUid {@min 32} {@max 32} @@ -129,6 +148,25 @@ class ProcessSupervisors extends Api return $response; } + /** + * @param string $prjUid {@min 32} {@max 32} + * + * @url GET /:prjUid/process-supervisor/available-assignmentsteps + */ + public function doGetAvailableProcessSupervisorAssignmentstep($prjUid) + { + try { + $supervisor = new \ProcessMaker\BusinessModel\ProcessSupervisor(); + $arrayData = $supervisor->getAvailableProcessSupervisorDynaformInputDocument($prjUid); + //Response + $response = $arrayData; + } catch (\Exception $e) { + //response + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + return $response; + } + /** * @param string $prjUid {@min 32} {@max 32} * diff --git a/workflow/engine/templates/designer/index.html b/workflow/engine/templates/designer/index.html index 4fa796318..1b97131d9 100644 --- a/workflow/engine/templates/designer/index.html +++ b/workflow/engine/templates/designer/index.html @@ -165,6 +165,9 @@
  • +
  • + +
  • diff --git a/workflow/engine/templates/pmTables/edit.js b/workflow/engine/templates/pmTables/edit.js index 204b9aa3a..b7098b0a9 100644 --- a/workflow/engine/templates/pmTables/edit.js +++ b/workflow/engine/templates/pmTables/edit.js @@ -186,9 +186,19 @@ Ext.onReady(function(){ xtype: 'textfield', allowBlank: true, listeners:{ - change: function(f,e){ - this.setValue(this.getValue().replace(/\s/g,'').toUpperCase()); + change: function(f,e){ + this.setValue(this.getValue().replace(/^\s+/,'').replace(/\s+$/,'')); + var valueInputField= /^[0-9a-zA-Z\_|-]+$/.test(this.getValue()) ? true : false; + if (valueInputField) { + this.setValue(this.getValue().replace(/\s/g,'').toUpperCase()); + }else{ + //Ext.Msg.alert(_('ID_WARNING'), _('ID_FIELD_NAME')); + this.setValue(''); + } } + }, + validator: function(v) { + return valueInputField= /^[0-9a-zA-Z\_|-]+$/.test(v)?true:false; } } }, { @@ -198,7 +208,20 @@ Ext.onReady(function(){ width: 220, editor:{ xtype: 'textfield', - allowBlank: true + allowBlank: true, + listeners:{ + change: function(f,e){ + this.setValue(this.getValue().replace(/^\s+/,'').replace(/\s+$/,'')); + var valueInputField= /^[0-9a-zA-Z\_|-]+$/.test(this.getValue()) ? true : false; + if (!valueInputField) { + //Ext.Msg.alert(_('ID_WARNING'), _('ID_FIELD_LABEL')); + this.setValue(''); + } + } + }, + validator: function(v) { + return valueInputField= /^[0-9a-zA-Z\_|-]+$/.test(v)?true:_('ID_ROLE_NAME_NOT_EMPTY'); + } } }, { id: 'field_type',