From 7f1c94897391f74890be08a6092e6bcca55db1d1 Mon Sep 17 00:00:00 2001 From: norahmollo Date: Mon, 10 Nov 2014 08:51:48 -0400 Subject: [PATCH 01/22] PM-697 Workspace restore Workspace restore with overwrite option --- workflow/engine/classes/class.wsTools.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index 5f27d5d4d..94280fbc3 100755 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -1496,9 +1496,8 @@ class workspaceTools if ($workspace->workspaceExists()) { - if ($overwrite) { - $overwriteSite = new workspaceTools($dstWorkspace); - if ($overwriteSite->dbInfo['DB_NAME'] == $overwriteSite->dbInfo['DB_RBAC_NAME']) { + if ($overwrite) { + if ($workspace->dbInfo['DB_NAME'] == $workspace->dbInfo['DB_RBAC_NAME']) { $newDatabases = 1; } else { $newDatabases = 3; From 7bc661cc02326a96e7d1d7aec29e45e40dea3121 Mon Sep 17 00:00:00 2001 From: norahmollo Date: Mon, 10 Nov 2014 09:01:51 -0400 Subject: [PATCH 02/22] PM-697 Workspace restore Workspace restore with overwrite option. --- workflow/engine/classes/class.wsTools.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index 5f27d5d4d..963b534d9 100755 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -1497,8 +1497,7 @@ class workspaceTools if ($workspace->workspaceExists()) { if ($overwrite) { - $overwriteSite = new workspaceTools($dstWorkspace); - if ($overwriteSite->dbInfo['DB_NAME'] == $overwriteSite->dbInfo['DB_RBAC_NAME']) { + if ($workspace->dbInfo['DB_NAME'] == $workspace->dbInfo['DB_RBAC_NAME']) { $newDatabases = 1; } else { $newDatabases = 3; From 9b77cb04c0e359a524ee4250e1a97ab3c74bf6ff Mon Sep 17 00:00:00 2001 From: norahmollo Date: Mon, 10 Nov 2014 14:23:43 -0400 Subject: [PATCH 03/22] PM-756 Cases Summary El tab por defecto More information. --- workflow/engine/templates/app/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/templates/app/main.js b/workflow/engine/templates/app/main.js index add2607f1..49b078607 100644 --- a/workflow/engine/templates/app/main.js +++ b/workflow/engine/templates/app/main.js @@ -522,7 +522,6 @@ var openSummaryWindow = function(appUid, delIndex, action) } }; - tabs.push(sumaryInfPanel); if (response.dynUid != '') { if (isMovil.any()) { var src = '../cases/summary?APP_UID=' + appUid + '&DEL_INDEX=' + delIndex + '&DYN_UID=' + response.dynUid; @@ -590,6 +589,7 @@ var openSummaryWindow = function(appUid, delIndex, action) }}); } } + tabs.push(sumaryInfPanel); tabs.push({title: Ext.util.Format.capitalize(_('ID_UPLOADED_DOCUMENTS')), bodyCfg: { tag: 'iframe', id: 'summaryIFrame', From 6d5b6c3393f6f07c86c55218238ba37cde492b89 Mon Sep 17 00:00:00 2001 From: norahmollo Date: Mon, 10 Nov 2014 15:23:15 -0400 Subject: [PATCH 04/22] PM-756 Cases Summary More Information debe estar seleccionada por defecto --- workflow/engine/templates/app/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow/engine/templates/app/main.js b/workflow/engine/templates/app/main.js index 49b078607..6a03efda2 100644 --- a/workflow/engine/templates/app/main.js +++ b/workflow/engine/templates/app/main.js @@ -590,6 +590,7 @@ var openSummaryWindow = function(appUid, delIndex, action) } } tabs.push(sumaryInfPanel); + tabs.push({title: Ext.util.Format.capitalize(_('ID_UPLOADED_DOCUMENTS')), bodyCfg: { tag: 'iframe', id: 'summaryIFrame', From ecacf6d15a38367e770939bc7ebad242b93a970a Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Mon, 10 Nov 2014 15:40:24 -0400 Subject: [PATCH 05/22] PM-854 "[16221] En Case History no muestra los datos de las..." SOLVED Issue: En "Cases History" no se reflejan las variables generadas por los triggers asignados al Task (esto en Task>Steps>Triggers>AssignTask) Cause: Nuevo requerimiento de funciones Solution: - Se ha implementado esta nueva funcionalidad - Las variables generadas en los triggers que se setean en "Task>Steps>Triggers" para DynaForms, InputDocuments and OutputDocuments ahora son registrados en la tabla APP_HISTORY --- workflow/engine/classes/class.case.php | 24 +- workflow/engine/classes/model/AppHistory.php | 76 ++++- .../model/map/AppHistoryMapBuilder.php | 4 + .../classes/model/om/BaseAppHistory.php | 96 ++++-- .../classes/model/om/BaseAppHistoryPeer.php | 26 +- workflow/engine/config/schema.xml | 4 + workflow/engine/data/mssql/schema.sql | 1 + workflow/engine/data/mysql/schema.sql | 2 + workflow/engine/data/oracle/schema.sql | 1 + .../engine/methods/cases/cases_Derivate.php | 18 +- .../methods/cases/cases_SaveDocument.php | 4 + workflow/engine/methods/cases/cases_Step.php | 18 +- .../cases/cases_DynaformHistory.html | 2 +- .../templates/cases/cases_DynaformHistory.php | 315 +++++++++--------- 14 files changed, 369 insertions(+), 222 deletions(-) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index d27f9c836..744d188df 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -5087,7 +5087,7 @@ class Cases $RESULT_OBJECTS['CASES_NOTES'] = G::arrayDiff( $MAIN_OBJECTS['VIEW']['CASES_NOTES'], $MAIN_OBJECTS['BLOCK']['CASES_NOTES'] ); - array_push($RESULT_OBJECTS['DYNAFORMS'], -1); + array_push($RESULT_OBJECTS["DYNAFORMS"], -1, -2); array_push($RESULT_OBJECTS['INPUT_DOCUMENTS'], -1); array_push($RESULT_OBJECTS['OUTPUT_DOCUMENTS'], -1); array_push($RESULT_OBJECTS['CASES_NOTES'], -1); @@ -5244,10 +5244,16 @@ class Cases $oDataset->next(); } - //inputs + //InputDocuments and OutputDocuments $oCriteria = new Criteria('workflow'); $oCriteria->addSelectColumn(AppDocumentPeer::APP_DOC_UID); $oCriteria->addSelectColumn(AppDocumentPeer::APP_DOC_TYPE); + + $arrayCondition = array(); + $arrayCondition[] = array(AppDelegationPeer::APP_UID, AppDocumentPeer::APP_UID, Criteria::EQUAL); + $arrayCondition[] = array(AppDelegationPeer::DEL_INDEX, AppDocumentPeer::DEL_INDEX, Criteria::EQUAL); + $oCriteria->addJoinMC($arrayCondition, Criteria::LEFT_JOIN); + $oCriteria->add(AppDelegationPeer::APP_UID, $APP_UID); $oCriteria->add(AppDelegationPeer::PRO_UID, $PRO_UID); if ($aCase['APP_STATUS'] != 'COMPLETED') { @@ -5261,23 +5267,21 @@ class Cases addOr($oCriteria-> getNewCriterion(AppDocumentPeer::APP_DOC_TYPE, 'ATTACHED')) ); - $aConditions = Array(); - $aConditions[] = array(AppDelegationPeer::APP_UID, AppDocumentPeer::APP_UID); - $aConditions[] = array(AppDelegationPeer::DEL_INDEX, AppDocumentPeer::DEL_INDEX); - $oCriteria->addJoinMC($aConditions, Criteria::LEFT_JOIN); - $oDataset = DynaformPeer::doSelectRS($oCriteria); + $oDataset = AppDelegationPeer::doSelectRS($oCriteria); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); - while ($aRow = $oDataset->getRow()) { + + while ($oDataset->next()) { + $aRow = $oDataset->getRow(); + if ($aRow['APP_DOC_TYPE'] == "ATTACHED") { $aRow['APP_DOC_TYPE'] = "INPUT"; } if (!in_array($aRow['APP_DOC_UID'], $RESULT[$aRow['APP_DOC_TYPE']])) { array_push($RESULT[$aRow['APP_DOC_TYPE']], $aRow['APP_DOC_UID']); } - $oDataset->next(); } + $RESULT['CASES_NOTES'] = 1; $RESULT['SUMMARY_FORM'] = 1; diff --git a/workflow/engine/classes/model/AppHistory.php b/workflow/engine/classes/model/AppHistory.php index 95b0b7e35..a18cc2901 100755 --- a/workflow/engine/classes/model/AppHistory.php +++ b/workflow/engine/classes/model/AppHistory.php @@ -32,6 +32,10 @@ class AppHistory extends BaseAppHistory $this->setHistoryDate($aData['APP_UPDATE_DATE']); $this->setHistoryData($aData['APP_DATA']); + if (isset($aData["OBJECT_TYPE"])) { + $this->setObjType($aData["OBJECT_TYPE"]); + } + if ($this->validate() ) { $res = $this->save(); } else { @@ -78,12 +82,36 @@ class AppHistory extends BaseAppHistory } } + $appDocument = new AppDocument(); + + foreach (array("INPUT_DOCUMENTS", "OUTPUT_DOCUMENTS") as $value) { + $key = $value; + + if ($aObjectPermissions[$key]) { + foreach ($aObjectPermissions[$key] as $key2 => $value2) { + $appDocumentUid = $value2; + + try { + $arrayAppDocumentData = $appDocument->load($appDocumentUid); + + $aObjectPermissions[$key][$key2] = $arrayAppDocumentData["DOC_UID"]; + } catch (Exception $e) { + } + } + } + } + + $dynaForm = new Dynaform(); + $inputDocument = new InputDocument(); + $outputDocument = new OutputDocument(); + $c = new Criteria('workflow'); $c->addSelectColumn(AppHistoryPeer::APP_UID); $c->addSelectColumn(AppHistoryPeer::DEL_INDEX); $c->addSelectColumn(AppHistoryPeer::PRO_UID); $c->addSelectColumn(AppHistoryPeer::TAS_UID); $c->addSelectColumn(AppHistoryPeer::DYN_UID); + $c->addSelectColumn(AppHistoryPeer::OBJ_TYPE); $c->addSelectColumn(AppHistoryPeer::USR_UID); $c->addSelectColumn(AppHistoryPeer::APP_STATUS); $c->addSelectColumn(AppHistoryPeer::HISTORY_DATE); @@ -94,31 +122,55 @@ class AppHistory extends BaseAppHistory $c->addJoin(AppHistoryPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN); //WHERE - $c->add(AppHistoryPeer::DYN_UID, $aObjectPermissions['DYNAFORMS'], Criteria::IN); + $c->add( + $c->getNewCriterion(AppHistoryPeer::DYN_UID, $aObjectPermissions["DYNAFORMS"], Criteria::IN)->addOr( + $c->getNewCriterion(AppHistoryPeer::DYN_UID, $aObjectPermissions["INPUT_DOCUMENTS"], Criteria::IN))->addOr( + $c->getNewCriterion(AppHistoryPeer::DYN_UID, $aObjectPermissions["OUTPUT_DOCUMENTS"], Criteria::IN)) + ); + $c->add(AppHistoryPeer::PRO_UID, $PRO_UID); $c->add(AppHistoryPeer::APP_UID, $APP_UID); if ((isset($DYN_UID))&&($DYN_UID!="")) { $c->add(AppHistoryPeer::DYN_UID, $DYN_UID); } - //ORDER BY - $c->clearOrderByColumns(); - $c->addDescendingOrderByColumn(AppHistoryPeer::HISTORY_DATE); - //Execute $oDataset = AppHistoryPeer::doSelectRS($c); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); $aDynHistory = array(); $aDynHistory[] = array( 'DYN_TITLE' => 'char' ); - while ($aRow = $oDataset->getRow()) { - $o = new Dynaform(); - $o->setDynUid($aRow['DYN_UID']); - $aRow['DYN_TITLE'] = $o->getDynTitle(); + while ($oDataset->next()) { + $aRow = $oDataset->getRow(); + + $title = ""; + + switch ($aRow["OBJ_TYPE"]) { + case "DYNAFORM": + $arrayDynaFormData = $dynaForm->Load($aRow["DYN_UID"]); + + $title = $arrayDynaFormData["DYN_TITLE"] . " (" . G::LoadTranslation("ID_DYNAFORM") . ")"; + break; + case "INPUT_DOCUMENT": + $arrayInputDocumentData = $inputDocument->load($aRow["DYN_UID"]); + + $title = $arrayInputDocumentData["INP_DOC_TITLE"] . " (" . G::LoadTranslation("ID_INPUT_DOCUMENT") . ")"; + break; + case "OUTPUT_DOCUMENT": + $arrayOutputDocumentData = $outputDocument->load($aRow["DYN_UID"]); + + $title = $arrayOutputDocumentData["OUT_DOC_TITLE"] . " (" . G::LoadTranslation("ID_OUTPUT_DOCUMENT") . ")"; + break; + case "ASSIGN_TASK": + $title = G::LoadTranslation("ASSIGN_TASK") . " (" . G::LoadTranslation("ID_TRIGGERS") . ")"; + break; + } + + $aRow["DYN_TITLE"] = $title; + $changedValues=unserialize($aRow['HISTORY_DATA']); $html=""; $sw_add=false; @@ -166,7 +218,6 @@ class AppHistory extends BaseAppHistory if ($sw_add) { $aDynHistory[] = $aRow; } - $oDataset->next(); } global $_DBArray; @@ -175,7 +226,8 @@ class AppHistory extends BaseAppHistory G::LoadClass('ArrayPeer'); $oCriteria = new Criteria('dbarray'); $oCriteria->setDBArrayTable('DynaformsHistory'); - $oCriteria->addDescendingOrderByColumn(AppHistoryPeer::HISTORY_DATE); + $oCriteria->addAscendingOrderByColumn(AppHistoryPeer::HISTORY_DATE); + return $oCriteria; } } diff --git a/workflow/engine/classes/model/map/AppHistoryMapBuilder.php b/workflow/engine/classes/model/map/AppHistoryMapBuilder.php index cd95ab885..2011d1496 100755 --- a/workflow/engine/classes/model/map/AppHistoryMapBuilder.php +++ b/workflow/engine/classes/model/map/AppHistoryMapBuilder.php @@ -75,6 +75,8 @@ class AppHistoryMapBuilder $tMap->addColumn('DYN_UID', 'DynUid', 'string', CreoleTypes::VARCHAR, true, 32); + $tMap->addColumn('OBJ_TYPE', 'ObjType', 'string', CreoleTypes::VARCHAR, true, 20); + $tMap->addColumn('USR_UID', 'UsrUid', 'string', CreoleTypes::VARCHAR, true, 32); $tMap->addColumn('APP_STATUS', 'AppStatus', 'string', CreoleTypes::VARCHAR, true, 100); @@ -83,6 +85,8 @@ class AppHistoryMapBuilder $tMap->addColumn('HISTORY_DATA', 'HistoryData', 'string', CreoleTypes::LONGVARCHAR, true, null); + $tMap->addValidator('OBJ_TYPE', 'validValues', 'propel.validator.ValidValuesValidator', 'DYNAFORM|INPUT_DOCUMENT|OUTPUT_DOCUMENT|EXTERNAL|ASSIGN_TASK', 'Please select a valid value for OBJ_TYPE.'); + } // doBuild() } // AppHistoryMapBuilder diff --git a/workflow/engine/classes/model/om/BaseAppHistory.php b/workflow/engine/classes/model/om/BaseAppHistory.php index 36cd414b1..1ed4938e2 100755 --- a/workflow/engine/classes/model/om/BaseAppHistory.php +++ b/workflow/engine/classes/model/om/BaseAppHistory.php @@ -57,6 +57,12 @@ abstract class BaseAppHistory extends BaseObject implements Persistent */ protected $dyn_uid = ''; + /** + * The value for the obj_type field. + * @var string + */ + protected $obj_type = 'DYNAFORM'; + /** * The value for the usr_uid field. * @var string @@ -150,6 +156,17 @@ abstract class BaseAppHistory extends BaseObject implements Persistent return $this->dyn_uid; } + /** + * Get the [obj_type] column value. + * + * @return string + */ + public function getObjType() + { + + return $this->obj_type; + } + /** * Get the [usr_uid] column value. * @@ -325,6 +342,28 @@ abstract class BaseAppHistory extends BaseObject implements Persistent } // setDynUid() + /** + * Set the value of [obj_type] column. + * + * @param string $v new value + * @return void + */ + public function setObjType($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->obj_type !== $v || $v === 'DYNAFORM') { + $this->obj_type = $v; + $this->modifiedColumns[] = AppHistoryPeer::OBJ_TYPE; + } + + } // setObjType() + /** * Set the value of [usr_uid] column. * @@ -447,20 +486,22 @@ abstract class BaseAppHistory extends BaseObject implements Persistent $this->dyn_uid = $rs->getString($startcol + 4); - $this->usr_uid = $rs->getString($startcol + 5); + $this->obj_type = $rs->getString($startcol + 5); - $this->app_status = $rs->getString($startcol + 6); + $this->usr_uid = $rs->getString($startcol + 6); - $this->history_date = $rs->getTimestamp($startcol + 7, null); + $this->app_status = $rs->getString($startcol + 7); - $this->history_data = $rs->getString($startcol + 8); + $this->history_date = $rs->getTimestamp($startcol + 8, null); + + $this->history_data = $rs->getString($startcol + 9); $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 9; // 9 = AppHistoryPeer::NUM_COLUMNS - AppHistoryPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 10; // 10 = AppHistoryPeer::NUM_COLUMNS - AppHistoryPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating AppHistory object", $e); @@ -680,15 +721,18 @@ abstract class BaseAppHistory extends BaseObject implements Persistent return $this->getDynUid(); break; case 5: - return $this->getUsrUid(); + return $this->getObjType(); break; case 6: - return $this->getAppStatus(); + return $this->getUsrUid(); break; case 7: - return $this->getHistoryDate(); + return $this->getAppStatus(); break; case 8: + return $this->getHistoryDate(); + break; + case 9: return $this->getHistoryData(); break; default: @@ -716,10 +760,11 @@ abstract class BaseAppHistory extends BaseObject implements Persistent $keys[2] => $this->getProUid(), $keys[3] => $this->getTasUid(), $keys[4] => $this->getDynUid(), - $keys[5] => $this->getUsrUid(), - $keys[6] => $this->getAppStatus(), - $keys[7] => $this->getHistoryDate(), - $keys[8] => $this->getHistoryData(), + $keys[5] => $this->getObjType(), + $keys[6] => $this->getUsrUid(), + $keys[7] => $this->getAppStatus(), + $keys[8] => $this->getHistoryDate(), + $keys[9] => $this->getHistoryData(), ); return $result; } @@ -767,15 +812,18 @@ abstract class BaseAppHistory extends BaseObject implements Persistent $this->setDynUid($value); break; case 5: - $this->setUsrUid($value); + $this->setObjType($value); break; case 6: - $this->setAppStatus($value); + $this->setUsrUid($value); break; case 7: - $this->setHistoryDate($value); + $this->setAppStatus($value); break; case 8: + $this->setHistoryDate($value); + break; + case 9: $this->setHistoryData($value); break; } // switch() @@ -822,19 +870,23 @@ abstract class BaseAppHistory extends BaseObject implements Persistent } if (array_key_exists($keys[5], $arr)) { - $this->setUsrUid($arr[$keys[5]]); + $this->setObjType($arr[$keys[5]]); } if (array_key_exists($keys[6], $arr)) { - $this->setAppStatus($arr[$keys[6]]); + $this->setUsrUid($arr[$keys[6]]); } if (array_key_exists($keys[7], $arr)) { - $this->setHistoryDate($arr[$keys[7]]); + $this->setAppStatus($arr[$keys[7]]); } if (array_key_exists($keys[8], $arr)) { - $this->setHistoryData($arr[$keys[8]]); + $this->setHistoryDate($arr[$keys[8]]); + } + + if (array_key_exists($keys[9], $arr)) { + $this->setHistoryData($arr[$keys[9]]); } } @@ -868,6 +920,10 @@ abstract class BaseAppHistory extends BaseObject implements Persistent $criteria->add(AppHistoryPeer::DYN_UID, $this->dyn_uid); } + if ($this->isColumnModified(AppHistoryPeer::OBJ_TYPE)) { + $criteria->add(AppHistoryPeer::OBJ_TYPE, $this->obj_type); + } + if ($this->isColumnModified(AppHistoryPeer::USR_UID)) { $criteria->add(AppHistoryPeer::USR_UID, $this->usr_uid); } @@ -951,6 +1007,8 @@ abstract class BaseAppHistory extends BaseObject implements Persistent $copyObj->setDynUid($this->dyn_uid); + $copyObj->setObjType($this->obj_type); + $copyObj->setUsrUid($this->usr_uid); $copyObj->setAppStatus($this->app_status); diff --git a/workflow/engine/classes/model/om/BaseAppHistoryPeer.php b/workflow/engine/classes/model/om/BaseAppHistoryPeer.php index 33148f6c3..9f49a07ef 100755 --- a/workflow/engine/classes/model/om/BaseAppHistoryPeer.php +++ b/workflow/engine/classes/model/om/BaseAppHistoryPeer.php @@ -25,7 +25,7 @@ abstract class BaseAppHistoryPeer const CLASS_DEFAULT = 'classes.model.AppHistory'; /** The total number of columns. */ - const NUM_COLUMNS = 9; + const NUM_COLUMNS = 10; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -46,6 +46,9 @@ abstract class BaseAppHistoryPeer /** the column name for the DYN_UID field */ const DYN_UID = 'APP_HISTORY.DYN_UID'; + /** the column name for the OBJ_TYPE field */ + const OBJ_TYPE = 'APP_HISTORY.OBJ_TYPE'; + /** the column name for the USR_UID field */ const USR_UID = 'APP_HISTORY.USR_UID'; @@ -69,10 +72,10 @@ abstract class BaseAppHistoryPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('AppUid', 'DelIndex', 'ProUid', 'TasUid', 'DynUid', 'UsrUid', 'AppStatus', 'HistoryDate', 'HistoryData', ), - BasePeer::TYPE_COLNAME => array (AppHistoryPeer::APP_UID, AppHistoryPeer::DEL_INDEX, AppHistoryPeer::PRO_UID, AppHistoryPeer::TAS_UID, AppHistoryPeer::DYN_UID, AppHistoryPeer::USR_UID, AppHistoryPeer::APP_STATUS, AppHistoryPeer::HISTORY_DATE, AppHistoryPeer::HISTORY_DATA, ), - BasePeer::TYPE_FIELDNAME => array ('APP_UID', 'DEL_INDEX', 'PRO_UID', 'TAS_UID', 'DYN_UID', 'USR_UID', 'APP_STATUS', 'HISTORY_DATE', 'HISTORY_DATA', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, ) + BasePeer::TYPE_PHPNAME => array ('AppUid', 'DelIndex', 'ProUid', 'TasUid', 'DynUid', 'ObjType', 'UsrUid', 'AppStatus', 'HistoryDate', 'HistoryData', ), + BasePeer::TYPE_COLNAME => array (AppHistoryPeer::APP_UID, AppHistoryPeer::DEL_INDEX, AppHistoryPeer::PRO_UID, AppHistoryPeer::TAS_UID, AppHistoryPeer::DYN_UID, AppHistoryPeer::OBJ_TYPE, AppHistoryPeer::USR_UID, AppHistoryPeer::APP_STATUS, AppHistoryPeer::HISTORY_DATE, AppHistoryPeer::HISTORY_DATA, ), + BasePeer::TYPE_FIELDNAME => array ('APP_UID', 'DEL_INDEX', 'PRO_UID', 'TAS_UID', 'DYN_UID', 'OBJ_TYPE', 'USR_UID', 'APP_STATUS', 'HISTORY_DATE', 'HISTORY_DATA', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) ); /** @@ -82,10 +85,10 @@ abstract class BaseAppHistoryPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('AppUid' => 0, 'DelIndex' => 1, 'ProUid' => 2, 'TasUid' => 3, 'DynUid' => 4, 'UsrUid' => 5, 'AppStatus' => 6, 'HistoryDate' => 7, 'HistoryData' => 8, ), - BasePeer::TYPE_COLNAME => array (AppHistoryPeer::APP_UID => 0, AppHistoryPeer::DEL_INDEX => 1, AppHistoryPeer::PRO_UID => 2, AppHistoryPeer::TAS_UID => 3, AppHistoryPeer::DYN_UID => 4, AppHistoryPeer::USR_UID => 5, AppHistoryPeer::APP_STATUS => 6, AppHistoryPeer::HISTORY_DATE => 7, AppHistoryPeer::HISTORY_DATA => 8, ), - BasePeer::TYPE_FIELDNAME => array ('APP_UID' => 0, 'DEL_INDEX' => 1, 'PRO_UID' => 2, 'TAS_UID' => 3, 'DYN_UID' => 4, 'USR_UID' => 5, 'APP_STATUS' => 6, 'HISTORY_DATE' => 7, 'HISTORY_DATA' => 8, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, ) + BasePeer::TYPE_PHPNAME => array ('AppUid' => 0, 'DelIndex' => 1, 'ProUid' => 2, 'TasUid' => 3, 'DynUid' => 4, 'ObjType' => 5, 'UsrUid' => 6, 'AppStatus' => 7, 'HistoryDate' => 8, 'HistoryData' => 9, ), + BasePeer::TYPE_COLNAME => array (AppHistoryPeer::APP_UID => 0, AppHistoryPeer::DEL_INDEX => 1, AppHistoryPeer::PRO_UID => 2, AppHistoryPeer::TAS_UID => 3, AppHistoryPeer::DYN_UID => 4, AppHistoryPeer::OBJ_TYPE => 5, AppHistoryPeer::USR_UID => 6, AppHistoryPeer::APP_STATUS => 7, AppHistoryPeer::HISTORY_DATE => 8, AppHistoryPeer::HISTORY_DATA => 9, ), + BasePeer::TYPE_FIELDNAME => array ('APP_UID' => 0, 'DEL_INDEX' => 1, 'PRO_UID' => 2, 'TAS_UID' => 3, 'DYN_UID' => 4, 'OBJ_TYPE' => 5, 'USR_UID' => 6, 'APP_STATUS' => 7, 'HISTORY_DATE' => 8, 'HISTORY_DATA' => 9, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) ); /** @@ -196,6 +199,8 @@ abstract class BaseAppHistoryPeer $criteria->addSelectColumn(AppHistoryPeer::DYN_UID); + $criteria->addSelectColumn(AppHistoryPeer::OBJ_TYPE); + $criteria->addSelectColumn(AppHistoryPeer::USR_UID); $criteria->addSelectColumn(AppHistoryPeer::APP_STATUS); @@ -542,6 +547,9 @@ abstract class BaseAppHistoryPeer } } else { + if ($obj->isNew() || $obj->isColumnModified(AppHistoryPeer::OBJ_TYPE)) + $columns[AppHistoryPeer::OBJ_TYPE] = $obj->getObjType(); + } return BasePeer::doValidate(AppHistoryPeer::DATABASE_NAME, AppHistoryPeer::TABLE_NAME, $columns); diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index d463b93e9..372637222 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -2549,10 +2549,14 @@ + + + + diff --git a/workflow/engine/data/mssql/schema.sql b/workflow/engine/data/mssql/schema.sql index 3df6c6e14..5579491d4 100755 --- a/workflow/engine/data/mssql/schema.sql +++ b/workflow/engine/data/mssql/schema.sql @@ -2612,6 +2612,7 @@ CREATE TABLE [APP_HISTORY] [PRO_UID] VARCHAR(32) default '' NOT NULL, [TAS_UID] VARCHAR(32) default '' NOT NULL, [DYN_UID] VARCHAR(32) default '' NOT NULL, + [OBJ_TYPE] VARCHAR(20) default 'DYNAFORM' NOT NULL, [USR_UID] VARCHAR(32) default '' NOT NULL, [APP_STATUS] VARCHAR(100) default '' NOT NULL, [HISTORY_DATE] CHAR(19) NULL, diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 728fb74af..fbd829521 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -1206,6 +1206,7 @@ CREATE TABLE `APP_HISTORY` `PRO_UID` VARCHAR(32) default '' NOT NULL, `TAS_UID` VARCHAR(32) default '' NOT NULL, `DYN_UID` VARCHAR(32) default '' NOT NULL, + `OBJ_TYPE` VARCHAR(20) default 'DYNAFORM' NOT NULL, `USR_UID` VARCHAR(32) default '' NOT NULL, `APP_STATUS` VARCHAR(100) default '' NOT NULL, `HISTORY_DATE` DATETIME, @@ -2380,3 +2381,4 @@ CREATE TABLE `LIST_UNASSIGNED_GROUP` )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Unassiged list'; # This restores the fkey checks, after having unset them earlier SET FOREIGN_KEY_CHECKS = 1; + diff --git a/workflow/engine/data/oracle/schema.sql b/workflow/engine/data/oracle/schema.sql index 81f038928..ebe247a2f 100755 --- a/workflow/engine/data/oracle/schema.sql +++ b/workflow/engine/data/oracle/schema.sql @@ -1491,6 +1491,7 @@ CREATE TABLE "APP_HISTORY" "PRO_UID" VARCHAR2(32) default '' NOT NULL, "TAS_UID" VARCHAR2(32) default '' NOT NULL, "DYN_UID" VARCHAR2(32) default '' NOT NULL, + "OBJ_TYPE" VARCHAR(20) default 'DYNAFORM' NOT NULL, "USR_UID" VARCHAR2(32) default '' NOT NULL, "APP_STATUS" VARCHAR2(100) default '' NOT NULL, "HISTORY_DATE" DATE, diff --git a/workflow/engine/methods/cases/cases_Derivate.php b/workflow/engine/methods/cases/cases_Derivate.php index 55ede1ff2..bd79ca272 100755 --- a/workflow/engine/methods/cases/cases_Derivate.php +++ b/workflow/engine/methods/cases/cases_Derivate.php @@ -80,15 +80,18 @@ try { $_SESSION['TRIGGER_DEBUG']['info'][0]['TRIGGERS_VALUES'] = $triggers; } - $appFields['DEL_INDEX'] = $_SESSION['INDEX']; - $appFields['TAS_UID'] = $_SESSION['TASK']; - unset($appFields['APP_STATUS']); unset($appFields['APP_PROC_STATUS']); unset($appFields['APP_PROC_CODE']); unset($appFields['APP_PIN']); - $oCase->updateCase( $_SESSION['APPLICATION'], $appFields ); //Save data + $appFields["DEL_INDEX"] = $_SESSION["INDEX"]; + $appFields["TAS_UID"] = $_SESSION["TASK"]; + $appFields["USER_UID"] = $_SESSION["USER_LOGGED"]; + $appFields["CURRENT_DYNAFORM"] = "-2"; + $appFields["OBJECT_TYPE"] = "ASSIGN_TASK"; + + $oCase->updateCase($_SESSION["APPLICATION"], $appFields); //Save data //derivate case $oDerivation = new Derivation(); @@ -112,6 +115,13 @@ try { unset($appFields['APP_PROC_STATUS']); unset($appFields['APP_PROC_CODE']); unset($appFields['APP_PIN']); + + $appFields["DEL_INDEX"] = $_SESSION["INDEX"]; + $appFields["TAS_UID"] = $_SESSION["TASK"]; + $appFields["USER_UID"] = $_SESSION["USER_LOGGED"]; + $appFields["CURRENT_DYNAFORM"] = "-2"; + $appFields["OBJECT_TYPE"] = "ASSIGN_TASK"; + $oCase->updateCase( $_SESSION['APPLICATION'], $appFields ); // Send notifications - Start diff --git a/workflow/engine/methods/cases/cases_SaveDocument.php b/workflow/engine/methods/cases/cases_SaveDocument.php index 954440b16..0263d7396 100755 --- a/workflow/engine/methods/cases/cases_SaveDocument.php +++ b/workflow/engine/methods/cases/cases_SaveDocument.php @@ -153,6 +153,10 @@ $arrayData["APP_NUMBER"] = $arrayField["APP_NUMBER"]; $arrayData["APP_DATA"] = $arrayField["APP_DATA"]; $arrayData["DEL_INDEX"] = $_SESSION["INDEX"]; $arrayData["TAS_UID"] = $_SESSION["TASK"]; +$arrayData["PRO_UID"] = $_SESSION["PROCESS"]; +$arrayData["USER_UID"] = $_SESSION["USER_LOGGED"]; +$arrayData["CURRENT_DYNAFORM"] = $inputDocumentUid; +$arrayData["OBJECT_TYPE"] = "INPUT_DOCUMENT"; $case->updateCase($_SESSION["APPLICATION"], $arrayData); diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 047039205..c6e6748e3 100755 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -182,12 +182,16 @@ unset($Fields['APP_STATUS']); unset($Fields['APP_PROC_STATUS']); unset($Fields['APP_PROC_CODE']); unset($Fields['APP_PIN']); + +$Fields["USER_UID"] = $_SESSION["USER_LOGGED"]; +$Fields["CURRENT_DYNAFORM"] = $_GET["UID"]; +$Fields["OBJECT_TYPE"] = ($_GET["UID"] == "-1")? "ASSIGN_TASK" : $_GET["TYPE"]; + $oCase->updateCase( $_SESSION['APPLICATION'], $Fields ); //Save data - End - //Obtain previous and next step - Start -try { +try { $oCase = new Cases(); $aNextStep = $oCase->getNextStep( $_SESSION['PROCESS'], $_SESSION['APPLICATION'], $_SESSION['INDEX'], $_SESSION['STEP_POSITION'] ); $aPreviousStep = $oCase->getPreviousStep( $_SESSION['PROCESS'], $_SESSION['APPLICATION'], $_SESSION['INDEX'], $_SESSION['STEP_POSITION'] ); @@ -266,12 +270,12 @@ try { $G_PUBLISH->AddContent('dynaform', 'xmlform', $_SESSION['PROCESS'] . '/' . $_GET['UID'], '', $Fields['APP_DATA'], 'cases_SaveData?UID=' . $_GET['UID'] . '&APP_UID=' . $_SESSION['APPLICATION'], '', (strtolower($oStep->getStepMode()) != 'edit' ? strtolower($oStep->getStepMode()) : '')); } break; - case 'INPUT_DOCUMENT': + case 'INPUT_DOCUMENT': if ($noShowTitle == 0) { $G_PUBLISH->AddContent( 'smarty', 'cases/cases_title', '', '', $array ); } $oInputDocument = new InputDocument(); - $Fields = $oInputDocument->load( $_GET['UID'] ); + $Fields = $oInputDocument->load( $_GET['UID'] ); if (! $aPreviousStep) { $Fields['__DYNAFORM_OPTIONS']['PREVIOUS_STEP_LABEL'] = ''; $Fields['PREVIOUS_STEP_LABEL'] = ''; @@ -285,13 +289,13 @@ try { $Fields['NEXT_STEP'] = $aNextStep['PAGE']; $Fields['NEXT_STEP_LABEL'] = G::loadTranslation( "ID_NEXT_STEP" ); switch ($_GET['ACTION']) { - case 'ATTACH': + case 'ATTACH': switch ($Fields['INP_DOC_FORM_NEEDED']) { case 'REAL': $Fields['TYPE_LABEL'] = G::LoadTranslation( 'ID_NEW' ); $sXmlForm = 'cases/cases_AttachInputDocument2'; break; - case 'VIRTUAL': + case 'VIRTUAL': $Fields['TYPE_LABEL'] = G::LoadTranslation( 'ID_ATTACH' ); $sXmlForm = 'cases/cases_AttachInputDocument1'; break; @@ -326,7 +330,7 @@ try { $oHeadPublisher = & headPublisher::getSingleton(); $titleDocument = "

" . $Fields['INP_DOC_TITLE'] . "
" . G::LoadTranslation( 'ID_INPUT_DOCUMENT' ) . "

"; - if ($Fields['INP_DOC_DESCRIPTION']) { + if ($Fields['INP_DOC_DESCRIPTION']) { $titleDocument .= " " . str_replace( "\n", "", str_replace( "'", "\'", nl2br( html_entity_decode($Fields['INP_DOC_DESCRIPTION'], ENT_COMPAT, "UTF-8") ) ) ) . ""; } diff --git a/workflow/engine/templates/cases/cases_DynaformHistory.html b/workflow/engine/templates/cases/cases_DynaformHistory.html index e29d39c50..3c0080cda 100755 --- a/workflow/engine/templates/cases/cases_DynaformHistory.html +++ b/workflow/engine/templates/cases/cases_DynaformHistory.html @@ -65,7 +65,7 @@
- +
{dynDate} {dynUser}
diff --git a/workflow/engine/templates/cases/cases_DynaformHistory.php b/workflow/engine/templates/cases/cases_DynaformHistory.php index 23e06109b..907403cf0 100755 --- a/workflow/engine/templates/cases/cases_DynaformHistory.php +++ b/workflow/engine/templates/cases/cases_DynaformHistory.php @@ -1,4 +1,4 @@ -prepare(); - -G::LoadClass('case'); -$oCase = new Cases(); -$Fields = $oCase->loadCase($_SESSION['APPLICATION']); - -// Load form info -if (isset($_REQUEST['DYN_UID']) && $_REQUEST['DYN_UID'] != '') { - $form = new Form($_REQUEST['PRO_UID'] . PATH_SEP . $_REQUEST['DYN_UID'], PATH_DYNAFORM, SYS_LANG, false); -} - -$historyData=array(); -$historyDataAux=array(); -require_once 'classes/model/AppHistory.php'; -$appHistory = new AppHistory(); -$c=$appHistory->getDynaformHistory($_REQUEST['PRO_UID'],$_REQUEST['TAS_UID'],$_REQUEST['APP_UID'],$_REQUEST['DYN_UID']); - -$oDataset = ArrayBasePeer::doSelectRs ( $c); -$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); -$oDataset->next(); - -$changeCount=0; -while ($aRow = $oDataset->getRow()) { - $changeCount++; - - $changedValues=unserialize($aRow['HISTORY_DATA']); - $tableName="_TCHANGE_".$changeCount; - $historyDataAux[$tableName]=$changedValues; - $oDataset->next(); -} - -$historyData=array_reverse($historyDataAux); -$changeCount=count($historyData); -foreach($historyData as $key => $value){ - $tableName="_TCHANGE_".$changeCount; - $changeCountA=$changeCount+1; - $tableNameA="_TCHANGE_".$changeCountA; - - if(isset($historyData[$tableNameA])){ - //$historyData[$key]=array_merge($historyData[$tableNameA],$value); - //Array merge recursive doesn't work. So here is an own procedure - $historyData[$key]=$historyData[$tableNameA]; - foreach($value as $key1 => $value2){ - if(!is_array($value2)){ - $historyData[$key][$key1]=$value2; - }else{ - foreach($value2 as $key3 => $value3){ - if(is_array($value3)){ - foreach($value3 as $key4 => $value4){ - $historyData[$key][$key1][$key3][$key4]=$value4; - } - } - } - } - - } - } - - - $changeCount--; -} - - - - -$oDataset = ArrayBasePeer::doSelectRs ( $c); -$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); -$oDataset->next(); -$changeCount=0; - -while ($aRow = $oDataset->getRow()) { - $changeCount++; - - - $changedValues=unserialize($aRow['HISTORY_DATA']); - - $tpl->newBlock( "DYNLOG" ); - $tableName="_TCHANGE_".$changeCount; - $changeCountA=$changeCount+1; - $tableNameA="_TCHANGE_".$changeCountA; - - $tpl->assign( "dynTitle" , addslashes($aRow['DYN_TITLE']) ); - $tpl->assign( "dynDate" , $aRow['HISTORY_DATE'] ); - $tpl->assign( "dynUser" , addslashes($aRow['USR_NAME']) ); - $tpl->assign( "changes" , G::LoadTranslation("ID_CHANGES") ); - $tpl->assign( "dynUID" , $aRow['DYN_UID'] ); - $tpl->assign( "tablename" , $tableName ); - - - $tpl->assign( "viewForm" , G::LoadTranslation("ID_VIEW") ); - $tpl->assign( "dynaform" , G::LoadTranslation("ID_DYNAFORM") ); - $tpl->assign( "date" , G::LoadTranslation("ID_DATE") ); - $tpl->assign( "user" , G::LoadTranslation("ID_USER") ); - - $tpl->assign( "fieldNameLabel" , G::LoadTranslation("ID_FIELDS") ); - $tpl->assign( "previousValuesLabel" , G::LoadTranslation("ID_PREV_VALUES") ); - $tpl->assign( "currentValuesLabel" , G::LoadTranslation("ID_CURRENT_VALUES") ); - - - - - $count=0; - foreach($changedValues as $key =>$value){ - if(($value!=NULL)&&(!is_array($value))){ - if (isset($form) && isset($form->fields[$key])) { - $label = $form->fields[$key]->label . ' (' . $key . ')'; - } - else { - $label = $key; - } - $tpl->newBlock( "FIELDLOG" ); - $tpl->assign( "fieldName" , $label ); - $tpl->assign( "previous" , isset($historyData[$tableNameA][$key])?$historyData[$tableNameA][$key]:"" ); - $tpl->assign( "actual" , $value ); - $count++; - } - if(is_array($value)){ - foreach($value as $key1 =>$value1){ - if(is_array($value1)){ - foreach($value1 as $key2 =>$value2) { - if (isset($form) && isset($form->fields[$key]->fields[$key2])) { - $label = $form->fields[$key]->fields[$key2]->label . ' (' . $key . '[' . $key1 . '][' . $key2 . '])'; - } - else { - $label = $key . '[' . $key1 . ']' . '[' . $key2 . ']'; - } - $tpl->newBlock( "FIELDLOG" ); - $tpl->assign( "fieldName" , $label ); - $tpl->assign( "previous" , isset($historyData[$tableNameA][$key][$key1][$key2])?$historyData[$tableNameA][$key][$key1][$key2]:"" ); - $tpl->assign( "actual" , $value2 ); - $count++; - } - } - } - } - } - $tpl->gotoBlock( "DYNLOG" ); - - $tpl->assign( "dynChanges" , G::LoadTranslation("ID_FIELDS_CHANGED_NUMBER")." (".$count.")" ); - $tpl->assign( "count" , $count+1 ); - - $oDataset->next(); - -} -if(!isset($changedValues)){ - $tpl->newBlock( "NORESULTS" ); - $tpl->assign( "noResults" , G::LoadTranslation("ID_NO_RECORDS_FOUND")); -} - - $_SESSION['HISTORY_DATA']=serialize($historyData); - $tpl->gotoBlock( "_ROOT" ); - - $tpl->printToScreen(); - -?> \ No newline at end of file + */ + +$tpl = new TemplatePower(PATH_TPL . "cases" . PATH_SEP . "cases_DynaformHistory.html"); + +$tpl->prepare(); + +require_once 'classes/model/AppHistory.php'; +G::LoadClass('case'); + +$oCase = new Cases(); +$Fields = $oCase->loadCase($_SESSION['APPLICATION']); + +// Load form info +if (isset($_REQUEST['DYN_UID']) && $_REQUEST['DYN_UID'] != '') { + $form = new Form($_REQUEST['PRO_UID'] . PATH_SEP . $_REQUEST['DYN_UID'], PATH_DYNAFORM, SYS_LANG, false); +} + +$historyData = array(); +$historyDataAux = array(); + +$appHistory = new AppHistory(); +$c = $appHistory->getDynaformHistory($_REQUEST['PRO_UID'], $_REQUEST['TAS_UID'], $_REQUEST['APP_UID'], $_REQUEST['DYN_UID']); + +$oDataset = ArrayBasePeer::doSelectRs($c); +$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + +$changeCount = 0; + +while ($oDataset->next()) { + $aRow = $oDataset->getRow(); + + $changeCount++; + + $changedValues = unserialize($aRow['HISTORY_DATA']); + $tableName = "_TCHANGE_" . $changeCount; + $historyDataAux[$tableName] = $changedValues; +} + +$historyData = array_reverse($historyDataAux); +$changeCount = count($historyData); + +foreach ($historyData as $key => $value) { + $tableName = "_TCHANGE_" . $changeCount; + $changeCountA = $changeCount + 1; + $tableNameA = "_TCHANGE_" . $changeCountA; + + if (isset($historyData[$tableNameA])) { + //$historyData[$key]=array_merge($historyData[$tableNameA],$value); + //Array merge recursive doesn't work. So here is an own procedure + $historyData[$key] = $historyData[$tableNameA]; + + foreach ($value as $key1 => $value2) { + if (!is_array($value2)) { + $historyData[$key][$key1] = $value2; + } else { + foreach ($value2 as $key3 => $value3) { + if (is_array($value3)) { + foreach ($value3 as $key4 => $value4) { + $historyData[$key][$key1][$key3][$key4] = $value4; + } + } + } + } + } + } + + $changeCount--; +} + +$oDataset = ArrayBasePeer::doSelectRs($c); +$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + +$changeCount = 0; + +while ($oDataset->next()) { + $aRow = $oDataset->getRow(); + + $changeCount++; + + $changedValues = unserialize($aRow['HISTORY_DATA']); + + $tpl->newBlock("DYNLOG"); + $tableName = "_TCHANGE_".$changeCount; + $changeCountA = $changeCount + 1; + $tableNameA = "_TCHANGE_" . $changeCountA; + + $tpl->assign("dynTitle", addslashes($aRow["DYN_TITLE"])); + $tpl->assign("dynDate", $aRow["HISTORY_DATE"]); + $tpl->assign("dynUser", addslashes($aRow["USR_NAME"])); + $tpl->assign("changes", G::LoadTranslation("ID_CHANGES")); + $tpl->assign("dynUID", $aRow["DYN_UID"]); + $tpl->assign("tablename", $tableName); + + $tpl->assign("viewForm", ($aRow["OBJ_TYPE"] == "DYNAFORM")? "" . G::LoadTranslation("ID_VIEW") . "" : ""); + $tpl->assign("dynaform", G::LoadTranslation("ID_DYNAFORM")); + $tpl->assign("date", G::LoadTranslation("ID_DATE")); + $tpl->assign("user", G::LoadTranslation("ID_USER")); + + $tpl->assign("fieldNameLabel", G::LoadTranslation("ID_FIELDS")); + $tpl->assign("previousValuesLabel", G::LoadTranslation("ID_PREV_VALUES")); + $tpl->assign("currentValuesLabel", G::LoadTranslation("ID_CURRENT_VALUES")); + + $count = 0; + + foreach ($changedValues as $key => $value) { + if ($value != null && !is_array($value)) { + if (isset($form) && isset($form->fields[$key])) { + $label = $form->fields[$key]->label . ' (' . $key . ')'; + } else { + $label = $key; + } + $tpl->newBlock("FIELDLOG"); + $tpl->assign("fieldName", $label); + $tpl->assign("previous", (isset($historyData[$tableNameA][$key]))? $historyData[$tableNameA][$key] : ""); + $tpl->assign("actual", $value); + $count++; + } + + if (is_array($value)) { + foreach ($value as $key1 => $value1) { + if (is_array($value1)) { + foreach ($value1 as $key2 => $value2) { + if (isset($form) && isset($form->fields[$key]->fields[$key2])) { + $label = $form->fields[$key]->fields[$key2]->label . ' (' . $key . '[' . $key1 . '][' . $key2 . '])'; + } else { + $label = $key . '[' . $key1 . ']' . '[' . $key2 . ']'; + } + $tpl->newBlock("FIELDLOG"); + $tpl->assign("fieldName", $label); + $tpl->assign("previous", (isset($historyData[$tableNameA][$key][$key1][$key2]))? $historyData[$tableNameA][$key][$key1][$key2] : ""); + $tpl->assign("actual", $value2); + $count++; + } + } + } + } + } + + $tpl->gotoBlock("DYNLOG"); + + $tpl->assign("dynChanges", G::LoadTranslation("ID_FIELDS_CHANGED_NUMBER") . " (" . $count . ")"); + $tpl->assign("count", $count + 1); +} + +if (!isset($changedValues)) { + $tpl->newBlock("NORESULTS"); + $tpl->assign("noResults", G::LoadTranslation("ID_NO_RECORDS_FOUND")); +} + +$_SESSION['HISTORY_DATA'] = serialize($historyData); +$tpl->gotoBlock("_ROOT"); + +$tpl->printToScreen(); + From 7cd3079e55362c47a5f606cf56ae2e47bee2bcc6 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Mon, 10 Nov 2014 17:33:43 -0400 Subject: [PATCH 06/22] PM 860 "Home > Users > Groups: La ordenacion de..." SOLVED Code Issue: Home > Users > Groups: La ordenacion de 'Groups' se ejecuta solo por pagina Cause: Al ordenar Groups este se ordenaba por pagina y no ordenando toda la paginas. Solution: Se ha agregado validacion al ordenar los Groups, el mismo permite ordenar todo los datos existentes en el listado. --- workflow/engine/classes/model/Groupwf.php | 16 ++++++++++++---- workflow/engine/methods/groups/groups_Ajax.php | 6 +++++- workflow/engine/templates/groups/groupsList.js | 5 +++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/workflow/engine/classes/model/Groupwf.php b/workflow/engine/classes/model/Groupwf.php index f99a70127..c20cf3da9 100755 --- a/workflow/engine/classes/model/Groupwf.php +++ b/workflow/engine/classes/model/Groupwf.php @@ -283,7 +283,7 @@ class Groupwf extends BaseGroupwf $c->add( ContentPeer::CON_CATEGORY, 'GRP_TITLE' ); $c->add( ContentPeer::CON_ID, $UidGroup ); $c->add( ContentPeer::CON_LANG, SYS_LANG ); - + $dataset = ContentPeer::doSelectRS( $c ); $dataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); $dataset->next(); @@ -343,7 +343,7 @@ class Groupwf extends BaseGroupwf return $result; } - public function getAllGroup ($start = null, $limit = null, $search = null) + public function getAllGroup ($start = null, $limit = null, $search = null, $sortField = null, $sortDir = null) { require_once PATH_RBAC . "model/RbacUsers.php"; require_once 'classes/model/TaskUser.php'; @@ -355,7 +355,6 @@ class Groupwf extends BaseGroupwf $criteria->addJoin( GroupwfPeer::GRP_UID, ContentPeer::CON_ID, Criteria::LEFT_JOIN ); $criteria->add( ContentPeer::CON_CATEGORY, 'GRP_TITLE' ); $criteria->add( ContentPeer::CON_LANG, SYS_LANG ); - $criteria->addAscendingOrderByColumn( ContentPeer::CON_VALUE ); if ($search) { $criteria->add( ContentPeer::CON_VALUE, '%' . $search . '%', Criteria::LIKE ); @@ -371,7 +370,16 @@ class Groupwf extends BaseGroupwf $criteria->addJoin( GroupwfPeer::GRP_UID, ContentPeer::CON_ID, Criteria::LEFT_JOIN ); $criteria->add( ContentPeer::CON_CATEGORY, 'GRP_TITLE' ); $criteria->add( ContentPeer::CON_LANG, SYS_LANG ); - $criteria->addAscendingOrderByColumn( ContentPeer::CON_VALUE ); + + if (is_null($sortField) || trim($sortField) == "") { + $sortField = ContentPeer::CON_VALUE; + } + + if (!is_null($sortDir) && trim($sortDir) != "" && strtoupper($sortDir) == "DESC") { + $criteria->addDescendingOrderByColumn($sortField); + } else { + $criteria->addAscendingOrderByColumn($sortField); + } if ($start != '') { $criteria->setOffset( $start ); diff --git a/workflow/engine/methods/groups/groups_Ajax.php b/workflow/engine/methods/groups/groups_Ajax.php index 71f8f67a0..ad1cdf99d 100644 --- a/workflow/engine/methods/groups/groups_Ajax.php +++ b/workflow/engine/methods/groups/groups_Ajax.php @@ -93,6 +93,9 @@ switch ($_POST['action']) { $limit = isset( $_REQUEST['limit'] ) ? $_REQUEST['limit'] : $limit_size; $filter = isset( $_REQUEST['textFilter'] ) ? $_REQUEST['textFilter'] : ''; + $sortField = isset($_REQUEST["sort"])? $_REQUEST["sort"] : ""; + $sortDir = isset($_REQUEST["dir"])? $_REQUEST["dir"] : ""; + global $RBAC; if ($limit == $start) { $limit = $limit + $limit; @@ -107,7 +110,8 @@ switch ($_POST['action']) { $uxList = adminProxy::getUxTypesList(); $groups = new Groupwf(); - $data = $groups->getAllGroup( $start, $limit, $filter ); + + $data = $groups->getAllGroup( $start, $limit, $filter, $sortField, $sortDir); $result = $data['rows']; $totalRows = 0; diff --git a/workflow/engine/templates/groups/groupsList.js b/workflow/engine/templates/groups/groupsList.js index aa7b53db9..4146dbbe7 100755 --- a/workflow/engine/templates/groups/groupsList.js +++ b/workflow/engine/templates/groups/groupsList.js @@ -212,6 +212,7 @@ Ext.onReady(function(){ }); store = new Ext.data.GroupingStore( { + remoteSort: true, proxy : new Ext.data.HttpProxy({ url: 'groups_Ajax?action=groupsList' }), @@ -243,8 +244,8 @@ Ext.onReady(function(){ {id:'GRP_UID', dataIndex: 'USR_UID', hidden:true, hideable:false}, {header: _('ID_GROUP_NAME'), dataIndex: 'CON_VALUE', width: 400, align:'left'}, {header: _('ID_STATUS'), dataIndex: 'GRP_STATUS', width: 130, align:'center', renderer: render_status}, - {header: _('ID_USERS'), dataIndex: 'GRP_USERS', width: 100, align:'center'}, - {header: _('ID_TASKS'), dataIndex: 'GRP_TASKS', width: 100, align:'center'} + {header: _("ID_USERS"), dataIndex: "GRP_USERS", sortable: false, width: 100, align:"center"}, + {header: _("ID_TASKS"), dataIndex: "GRP_TASKS", sortable: false, width: 100, align:"center"} ] }); From 519bbf9d164f0b4d9ec9880983e7ff0ec2296d7e Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Tue, 11 Nov 2014 10:49:18 -0400 Subject: [PATCH 07/22] BUG-16258 "Grid no respeta tamano al agregar nuevas filas" SOLVED Issue: Los DropDowns en Grids no respetan el atributo "style" que se define en el XML Cause: Al crear el nuevo elemento "select" solo se copian ciertos atributos, no todos los definidos en su tag HTML Solution: Se reemplaza el codigo para la creacion del nuevo "select", ahora se usa el metodo "cloneElement" --- gulliver/js/grid/core/grid.js | 30 ++++------------------------- gulliver/js/maborak/core/maborak.js | 8 ++------ 2 files changed, 6 insertions(+), 32 deletions(-) diff --git a/gulliver/js/grid/core/grid.js b/gulliver/js/grid/core/grid.js index 0f980b49c..e7b2fe4fd 100755 --- a/gulliver/js/grid/core/grid.js +++ b/gulliver/js/grid/core/grid.js @@ -376,7 +376,7 @@ var G_Grid = function(oForm, sGridName){ var aCells = oRow.getElementsByTagName('td'); var oNewRow = this.oGrid.insertRow(this.oGrid.rows.length - 1); var currentRow = this.oGrid.rows.length - 2; - var newID, attributes, img2, gridType; + var newID, attributes, img2; oNewRow.onmouseover=function(){ highlightRow(this, '#D9E8FF'); @@ -576,34 +576,16 @@ var G_Grid = function(oForm, sGridName){ aObjects = null; break; case 'select': //DROPDOWN - var oNewSelect; aObjects = oNewRow.getElementsByTagName('td')[i].getElementsByTagName('select'); + if (aObjects){ newID = aObjects[0].id.replace(/\[1\]/g, '\[' + currentRow + '\]'); aObjects[0].id = newID; aObjects[0].name = newID; - oNewSelect = document.createElement(aObjects[0].tagName); + var oNewSelect = this.cloneElement(aObjects[0]); oNewSelect.id = newID; oNewSelect.name = newID; - oNewSelect.setAttribute('class','module_app_input___gray'); - - aAttributes = aObjects[0].attributes; - for (a=0; a < aAttributes.length; a++){ - if (aAttributes[a].name.indexOf('pm:') != -1){ - oNewSelect.setAttribute(aAttributes[a].name,aAttributes[a].value); - } - if (aAttributes[a].name == 'disabled'){ - if (_BROWSER.name == 'msie'){ - if (aAttributes[a].value=='true'){ - oNewSelect.setAttribute(aAttributes[a].name,aAttributes[a].value); - } - } - else{ - oNewSelect.setAttribute(aAttributes[a].name,aAttributes[a].value); - } - } - } attributes = elementAttributesNS(aObjects[0], 'pm'); //var MyAtt = attributes; @@ -614,11 +596,7 @@ var G_Grid = function(oForm, sGridName){ }else{ defaultValue = ''; } - if (attributes.gridtype != '' && typeof attributes.gridtype != 'undefined'){ - gridType = attributes.gridtype; - }else{ - gridType = ''; - } + var aDependents = this.allDependentFields.split(','); sObject = this.getObjectName(newID); diff --git a/gulliver/js/maborak/core/maborak.js b/gulliver/js/maborak/core/maborak.js index fde5e6dc2..263407a68 100644 --- a/gulliver/js/maborak/core/maborak.js +++ b/gulliver/js/maborak/core/maborak.js @@ -1381,7 +1381,7 @@ switch(tag.toLowerCase()){case"input":case"textarea":newElem.value=elem.value;br newElem.options[i]=new Option(elem.options[i].text,elem.options[i].value,elem.options[i].defaultSelected);} newElem.options[pos].selected=true;} break;} -return newElem;};this.replaceHtml=function(el,html){var oldEl=typeof el==="string"?document.getElementById(el):el;if(this.determineBrowser()=="MSIE"){oldEl.innerHTML=html;return oldEl;}else{var newEl=oldEl.cloneNode(false);newEl.innerHTML=html;oldEl.parentNode.replaceChild(newEl,oldEl);return newEl;}};this.addGridRow=function(){this.oGrid=document.getElementById(this.sGridName);var i,aObjects;var defaultValue='';var n,a,x;var oRow=document.getElementById('firstRow_'+this.sGridName);var aCells=oRow.getElementsByTagName('td');var oNewRow=this.oGrid.insertRow(this.oGrid.rows.length-1);var currentRow=this.oGrid.rows.length-2;var newID,attributes,img2,gridType;oNewRow.onmouseover=function(){highlightRow(this,'#D9E8FF');};oNewRow.onmouseout=function(){highlightRow(this,'#fff');};for(i=0;i Date: Wed, 12 Nov 2014 12:06:03 -0400 Subject: [PATCH 08/22] PM-813 Categories List El ordenamiento se realiza solo por pagina --- .../processCategory/processCategory_Ajax.php | 13 ++++++++++++- .../processCategory/processCategoryList.js | 11 +++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/workflow/engine/methods/processCategory/processCategory_Ajax.php b/workflow/engine/methods/processCategory/processCategory_Ajax.php index 54cef67b5..c34d2b5bb 100755 --- a/workflow/engine/methods/processCategory/processCategory_Ajax.php +++ b/workflow/engine/methods/processCategory/processCategory_Ajax.php @@ -35,6 +35,8 @@ if (isset( $_REQUEST['action'] )) { $start = isset( $_POST['start'] ) ? $_POST['start'] : 0; $limit = isset( $_POST['limit'] ) ? $_POST['limit'] : $limit_size; $filter = isset( $_REQUEST['textFilter'] ) ? $_REQUEST['textFilter'] : ''; + $dir = isset( $_POST['dir'] ) ? $_POST['dir'] : 'ASC'; + $sort = isset( $_POST['sort'] ) ? $_POST['sort'] : 'CATEGORY_NAME'; $oCriteria = new Criteria( 'workflow' ); $oCriteria->addSelectColumn( 'COUNT(*) AS CNT' ); @@ -55,6 +57,13 @@ if (isset( $_REQUEST['action'] )) { if ($filter != '') { $oCriteria->add( ProcessCategoryPeer::CATEGORY_NAME, '%' . $filter . '%', Criteria::LIKE ); } + + if ($dir == "DESC") { + $oCriteria->addDescendingOrderByColumn($sort); + } else { + $oCriteria->addAscendingOrderByColumn($sort); + } + $oCriteria->setLimit( $limit ); $oCriteria->setOffset( $start ); $oDataset = ProcessCategoryPeer::doSelectRS( $oCriteria ); @@ -69,7 +78,9 @@ if (isset( $_REQUEST['action'] )) { $index = sizeof( $aCat ) - 1; $aCat[$index]['TOTAL_PROCESSES'] = isset( $aProcess[$aCat[$index]['CATEGORY_UID']] ) ? $aProcess[$aCat[$index]['CATEGORY_UID']] : 0; } - echo '{categories: ' . G::json_encode( $aCat ) . ', total_categories: ' . $total_categories . '}'; + $r['data'] = $aCat; + $r['totalCount'] = $total_categories; + echo G::json_encode( $r ); break; case 'updatePageSize': G::LoadClass( 'configuration' ); diff --git a/workflow/engine/templates/processCategory/processCategoryList.js b/workflow/engine/templates/processCategory/processCategoryList.js index 1b76bac04..b3de47df1 100755 --- a/workflow/engine/templates/processCategory/processCategoryList.js +++ b/workflow/engine/templates/processCategory/processCategoryList.js @@ -160,13 +160,14 @@ Ext.onReady(function(){ } }); - store = new Ext.data.GroupingStore( { + store = new Ext.data.GroupingStore({ + remoteSort: true, proxy : new Ext.data.HttpProxy({ url: 'processCategory_Ajax?action=processCategoryList' }), - reader : new Ext.data.JsonReader( { - root: 'categories', - totalProperty: 'total_categories', + reader : new Ext.data.JsonReader({ + totalProperty: 'totalCount', + root: 'data', fields : [ {name : 'CATEGORY_UID'}, {name : 'CATEGORY_PARENT'}, @@ -176,7 +177,6 @@ Ext.onReady(function(){ ] }) }); - cmodel = new Ext.grid.ColumnModel({ defaults: { width: 50, @@ -274,7 +274,6 @@ Ext.onReady(function(){ ); infoGrid.addListener('rowcontextmenu',onMessageContextMenu,this); - infoGrid.store.load(); viewport = new Ext.Viewport({ From d61dcc2778feaf20eab3a5e1f1bdc0cd29d9a85a Mon Sep 17 00:00:00 2001 From: jennylee Date: Wed, 12 Nov 2014 12:32:15 -0400 Subject: [PATCH 09/22] PM-815 Al correr caso con PMtable de dynaform eliminado sale error. PROBLEMA: Cuando se elimina un PMTABLE que se uso para crear un dynaform y se corre un caso sale un error impidiendo correr el caso. Se intentaba buscar el PMTable y argar los datos del dynaform en el mismo. SOLUCION: Se agrego una validacion para que cuando no encuentre el pmtable lance un mensaje de warning para advertir al usuario q no se encontro la tabla, pero aun asi mostrar el dynafomr de modo normal. Cuando se guardan los datos del dynaform tambien se muestra un mensaje advirtiendo q no se pudo guardar los datos en la PM table pero si se guardo con normalidad en la BD. --- gulliver/system/class.xmlform.php | 87 ++++++++++--------- .../engine/methods/cases/cases_SaveData.php | 37 ++++---- 2 files changed, 69 insertions(+), 55 deletions(-) diff --git a/gulliver/system/class.xmlform.php b/gulliver/system/class.xmlform.php index bdd08eb9f..7911fec92 100755 --- a/gulliver/system/class.xmlform.php +++ b/gulliver/system/class.xmlform.php @@ -737,47 +737,54 @@ class XmlForm_Field $aKeys = array (); $aValues = explode( '|', $oOwner->fields[$this->pmconnection]->keys ); $i = 0; - foreach ($aData['FIELDS'] as $aField) { - if ($aField['FLD_KEY'] == '1') { - // note added by gustavo cruz gustavo[at]colosa[dot]com - // this additional [if] checks if a case variable has been set - // in the keys attribute, so it can be parsed and replaced for - // their respective value. - if (preg_match( "/@#/", $aValues[$i] )) { - // check if a case are running in order to prevent that preview is - // erroneous rendered. - if (isset( $_SESSION['APPLICATION'] )) { - G::LoadClass( 'case' ); - $oApp = new Cases(); - if ($oApp->loadCase( $_SESSION['APPLICATION'] ) != null) { - $aFields = $oApp->loadCase( $_SESSION['APPLICATION'] ); - $formVariable = substr( $aValues[$i], 2 ); - if (isset( $aFields['APP_DATA'][$formVariable] )) { - $formVariableValue = $aFields['APP_DATA'][$formVariable]; - $aKeys[$aField['FLD_NAME']] = (isset( $formVariableValue ) ? G::replaceDataField( $formVariableValue, $oOwner->values ) : ''); - } else { - $aKeys[$aField['FLD_NAME']] = ''; - } - } else { - $aKeys[$aField['FLD_NAME']] = ''; - } - } else { - $aKeys[$aField['FLD_NAME']] = ''; - } - } else { - $aKeys[$aField['FLD_NAME']] = (isset( $aValues[$i] ) ? G::replaceDataField( $aValues[$i], $oOwner->values ) : ''); - } - $i ++; - } - } - try { - $aData = $oAdditionalTables->getDataTable( $oOwner->fields[$this->pmconnection]->pmtable, $aKeys ); - } catch (Exception $oError) { - $aData = array (); - } - if (isset( $aData[$this->pmfield] )) { - $sValue = $aData[$this->pmfield]; + if($aData == "" || count($aData['FIELDS']) < 1){ + $message = G::LoadTranslation( 'ID_PMTABLE_NOT_FOUND' ); + G::SendMessageText( $message, "WARNING" ); + $sValue = ""; + } else { + foreach ($aData['FIELDS'] as $aField) { + if ($aField['FLD_KEY'] == '1') { + // note added by gustavo cruz gustavo[at]colosa[dot]com + // this additional [if] checks if a case variable has been set + // in the keys attribute, so it can be parsed and replaced for + // their respective value. + if (preg_match( "/@#/", $aValues[$i] )) { + // check if a case are running in order to prevent that preview is + // erroneous rendered. + if (isset( $_SESSION['APPLICATION'] )) { + G::LoadClass( 'case' ); + $oApp = new Cases(); + if ($oApp->loadCase( $_SESSION['APPLICATION'] ) != null) { + $aFields = $oApp->loadCase( $_SESSION['APPLICATION'] ); + $formVariable = substr( $aValues[$i], 2 ); + if (isset( $aFields['APP_DATA'][$formVariable] )) { + $formVariableValue = $aFields['APP_DATA'][$formVariable]; + $aKeys[$aField['FLD_NAME']] = (isset( $formVariableValue ) ? G::replaceDataField( $formVariableValue, $oOwner->values ) : ''); + } else { + $aKeys[$aField['FLD_NAME']] = ''; + } + } else { + $aKeys[$aField['FLD_NAME']] = ''; + } + } else { + $aKeys[$aField['FLD_NAME']] = ''; + } + } else { + $aKeys[$aField['FLD_NAME']] = (isset( $aValues[$i] ) ? G::replaceDataField( $aValues[$i], $oOwner->values ) : ''); + } + $i ++; + } + } + try { + $aData = $oAdditionalTables->getDataTable( $oOwner->fields[$this->pmconnection]->pmtable, $aKeys ); + } catch (Exception $oError) { + $aData = array (); + } + if (isset( $aData[$this->pmfield] )) { + $sValue = $aData[$this->pmfield]; + } } + } } } diff --git a/workflow/engine/methods/cases/cases_SaveData.php b/workflow/engine/methods/cases/cases_SaveData.php index 0a0a719e4..3958810bf 100644 --- a/workflow/engine/methods/cases/cases_SaveData.php +++ b/workflow/engine/methods/cases/cases_SaveData.php @@ -123,22 +123,29 @@ try { $aAux = explode( '|', $oForm->fields[$oForm->fields[$sField]->pmconnection]->keys ); $i = 0; $aValues = array (); - foreach ($aData['FIELDS'] as $aField) { - if ($aField['FLD_KEY'] == '1') { - $aKeys[$aField['FLD_NAME']] = (isset( $aAux[$i] ) ? G::replaceDataField( $aAux[$i], $Fields['APP_DATA'] ) : ''); - $i ++; - } - if ($aField['FLD_NAME'] == $oForm->fields[$sField]->pmfield) { - $aValues[$aField['FLD_NAME']] = $Fields['APP_DATA'][$sField]; - } else { - $aValues[$aField['FLD_NAME']] = ''; - } - } - try { - $aRow = $oAdditionalTables->getDataTable( $oForm->fields[$oForm->fields[$sField]->pmconnection]->pmtable, $aKeys ); - } catch (Exception $oError) { - $aRow = false; + if($aData == "" || count($aData['FIELDS']) < 1){ + $message = G::LoadTranslation( 'ID_PMTABLE_NOT_FOUNDED_SAVED_DATA' ); + G::SendMessageText( $message, "WARNING" ); + $aRow = false; + } else { + foreach ($aData['FIELDS'] as $aField) { + if ($aField['FLD_KEY'] == '1') { + $aKeys[$aField['FLD_NAME']] = (isset( $aAux[$i] ) ? G::replaceDataField( $aAux[$i], $Fields['APP_DATA'] ) : ''); + $i ++; + } + if ($aField['FLD_NAME'] == $oForm->fields[$sField]->pmfield) { + $aValues[$aField['FLD_NAME']] = $Fields['APP_DATA'][$sField]; + } else { + $aValues[$aField['FLD_NAME']] = ''; + } + } + try { + $aRow = $oAdditionalTables->getDataTable( $oForm->fields[$oForm->fields[$sField]->pmconnection]->pmtable, $aKeys ); + } catch (Exception $oError) { + $aRow = false; + } } + if ($aRow) { foreach ($aValues as $sKey => $sValue) { if ($sKey != $oForm->fields[$sField]->pmfield) { From e89ddd6499191724f7d5a65850e6d0d80dd371c7 Mon Sep 17 00:00:00 2001 From: norahmollo Date: Wed, 12 Nov 2014 13:48:04 -0400 Subject: [PATCH 10/22] PM-813 Process Category List Sort all results --- .../methods/processCategory/processCategory_Ajax.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workflow/engine/methods/processCategory/processCategory_Ajax.php b/workflow/engine/methods/processCategory/processCategory_Ajax.php index c34d2b5bb..a96baf10c 100755 --- a/workflow/engine/methods/processCategory/processCategory_Ajax.php +++ b/workflow/engine/methods/processCategory/processCategory_Ajax.php @@ -71,16 +71,16 @@ if (isset( $_REQUEST['action'] )) { $proc = new Process(); $aProcess = $proc->getAllProcessesByCategory(); - + $result = ""; $aCat = array (); while ($oDataset->next()) { $aCat[] = $oDataset->getRow(); $index = sizeof( $aCat ) - 1; $aCat[$index]['TOTAL_PROCESSES'] = isset( $aProcess[$aCat[$index]['CATEGORY_UID']] ) ? $aProcess[$aCat[$index]['CATEGORY_UID']] : 0; } - $r['data'] = $aCat; - $r['totalCount'] = $total_categories; - echo G::json_encode( $r ); + $result['data'] = $aCat; + $result['totalCount'] = $total_categories; + echo G::json_encode( $result ); break; case 'updatePageSize': G::LoadClass( 'configuration' ); From b0f9a16fd0f9a417d7742830af3e7a5f1860b1a7 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Wed, 12 Nov 2014 16:24:43 -0400 Subject: [PATCH 11/22] PM 912 "16253: Creation date on designer does..." SOLVED Code Issue: 16253: Creation date on designer does not list rigth Cause: En Designer al ordenar por la columna Create Date cuando se tiene la figuracion d/m/Y, el mismo no ordenaba. Solution: Se ha agregado validacion al ordenar por Create Date, el mismo permite mostrar el ordenamiento de las fechas. --- workflow/engine/classes/model/Process.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/workflow/engine/classes/model/Process.php b/workflow/engine/classes/model/Process.php index bc0d2a63c..af2643395 100755 --- a/workflow/engine/classes/model/Process.php +++ b/workflow/engine/classes/model/Process.php @@ -644,6 +644,14 @@ class Process extends BaseProcess $oCriteria->addJoin( ProcessPeer::PRO_CREATE_USER, UsersPeer::USR_UID, Criteria::LEFT_JOIN ); $oCriteria->addJoin( ProcessPeer::PRO_CATEGORY, ProcessCategoryPeer::CATEGORY_UID, Criteria::LEFT_JOIN ); + if ($this->sort == "PRO_CREATE_DATE") { + if ($this->dir == "DESC") { + $oCriteria->addDescendingOrderByColumn(ProcessPeer::PRO_CREATE_DATE); + } else { + $oCriteria->addAscendingOrderByColumn(ProcessPeer::PRO_CREATE_DATE); + } + } + if ($userLogged != "") { $oCriteria->add( $oCriteria->getNewCriterion(ProcessPeer::PRO_TYPE_PROCESS, "PUBLIC", Criteria::EQUAL)->addOr( @@ -782,10 +790,13 @@ class Process extends BaseProcess if ($limit == '') { $limit = count($aProcesses); } - if ($this->dir=='ASC') { - usort( $aProcesses, array($this, "ordProcessAsc") ); - } else { - usort( $aProcesses, array($this, "ordProcessDesc") ); + + if ($this->sort != "PRO_CREATE_DATE") { + if ($this->dir == "ASC") { + usort($aProcesses, array($this, "ordProcessAsc")); + } else { + usort($aProcesses, array($this, "ordProcessDesc")); + } } return $aProcesses; From d892d3177a41be1c7400cd789d4e98c18ea3c8c4 Mon Sep 17 00:00:00 2001 From: Julio Cesar Laura Date: Wed, 12 Nov 2014 16:57:29 -0400 Subject: [PATCH 12/22] PM-927 NO se visualiza la tarea en case history con php 5.4 SOLVED --- workflow/engine/classes/class.case.php | 2 +- workflow/engine/methods/cases/caseHistory_Ajax.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index 744d188df..a0966d2f3 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -960,7 +960,7 @@ class Cases //only when that variable is set.. from Save $FieldsBefore = $this->loadCase($sAppUid); $FieldsDifference = $this->arrayRecursiveDiff($FieldsBefore['APP_DATA'], $aApplicationFields); - $fieldsOnBoth = array_intersect_assoc($FieldsBefore['APP_DATA'], $aApplicationFields); + $fieldsOnBoth = @array_intersect_assoc($FieldsBefore['APP_DATA'], $aApplicationFields); //Add fields that weren't in previous version foreach ($aApplicationFields as $key => $value) { if (!(isset($fieldsOnBoth[$key]))) { diff --git a/workflow/engine/methods/cases/caseHistory_Ajax.php b/workflow/engine/methods/cases/caseHistory_Ajax.php index c27ecdd9a..85c94c7f4 100644 --- a/workflow/engine/methods/cases/caseHistory_Ajax.php +++ b/workflow/engine/methods/cases/caseHistory_Ajax.php @@ -46,7 +46,8 @@ if ($actionAjax == 'historyGridList_JXP') { } $newDir = '/tmp/test/directory'; - $r = G::verifyPath( $newDir ); + G::verifyPath( $newDir ); + $r = new stdclass(); $r->data = $aProcesses; $r->totalCount = 2; From c5a1d64c06d43bf6266960158d806dd845f37294 Mon Sep 17 00:00:00 2001 From: Julio Cesar Laura Date: Thu, 13 Nov 2014 12:47:38 -0400 Subject: [PATCH 13/22] PM-933 Nos muestra un warning en case history SOLVED --- workflow/engine/methods/cases/ajaxListener.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workflow/engine/methods/cases/ajaxListener.php b/workflow/engine/methods/cases/ajaxListener.php index 570ac9e80..3506c629e 100755 --- a/workflow/engine/methods/cases/ajaxListener.php +++ b/workflow/engine/methods/cases/ajaxListener.php @@ -679,6 +679,8 @@ class Ajax $_REQUEST["TAS_UID"] = $idHistoryArray[2]; $_REQUEST["DYN_UID"] = ""; + $result = new stdclass(); + $G_PUBLISH = new Publisher(); $G_PUBLISH->AddContent('view', 'cases/cases_DynaformHistory'); ?> From aafbe8ff557571a10629180f2181e724e9439e7e Mon Sep 17 00:00:00 2001 From: Julio Cesar Laura Date: Fri, 14 Nov 2014 09:50:04 -0400 Subject: [PATCH 14/22] Fix conditions in class AuthenticationSource --- .../classes/model/AuthenticationSource.php | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/rbac/engine/classes/model/AuthenticationSource.php b/rbac/engine/classes/model/AuthenticationSource.php index 098607f98..3b16760c6 100755 --- a/rbac/engine/classes/model/AuthenticationSource.php +++ b/rbac/engine/classes/model/AuthenticationSource.php @@ -8,7 +8,7 @@ * You should add additional methods to this class to meet the * application requirements. This class will only be generated as * long as it does not already exist in the output directory. - * + * */ /** @@ -27,7 +27,7 @@ class AuthenticationSource extends BaseAuthenticationSource { $oCriteria->add(AuthenticationSourcePeer::AUTH_SOURCE_UID, '', Criteria::NOT_EQUAL); return $oCriteria; } - + public function load($sUID) { try { $oAuthenticationSource = AuthenticationSourcePeer::retrieveByPK($sUID); @@ -69,13 +69,13 @@ class AuthenticationSource extends BaseAuthenticationSource { $oConnection->begin(); $iResult = $oAuthenticationSource->save(); $oConnection->commit(); - + $authSourceServerName = isset($aData['AUTH_SOURCE_SERVER_NAME']) ? ' - Server Name: '.$aData['AUTH_SOURCE_SERVER_NAME'] : ''; $authSourcePort = isset($aData['AUTH_SOURCE_PORT']) ? ' - Port: '.$aData['AUTH_SOURCE_PORT'] : ''; $authSourceEnabledTLS = isset($aData['AUTH_SOURCE_ENABLED_TLS']) ? ' - TLS: '.$aData['AUTH_SOURCE_ENABLED_TLS'] : ''; $authSourceVersion = isset($aData['AUTH_SOURCE_VERSION']) ? ' - Version: '.$aData['AUTH_SOURCE_VERSION'] : ''; $authSourceBaseDn = isset($aData['AUTH_SOURCE_BASE_DN']) ? ' - BaseDN: '.$aData['AUTH_SOURCE_BASE_DN'] : ''; - $authAnonymous = $aData['AUTH_ANONYMOUS'] = 1? ' - Anonymous: YES' : ' - Anonymous: NO'; + $authAnonymous = $aData['AUTH_ANONYMOUS'] == 1? ' - Anonymous: YES' : ' - Anonymous: NO'; $authSourceSearchUser = isset($aData['AUTH_SOURCE_SEARCH_USER']) ? ' - Search User: '. $aData['AUTH_SOURCE_SEARCH_USER'] : ''; $authSourceLdapType = isset($aData['AUTH_SOURCE_DATA']['LDAP_TYPE']) ? ' - LDAP type: '.$aData['AUTH_SOURCE_DATA']['LDAP_TYPE'] : ''; $authSourceIdentifier = isset($aData['AUTH_SOURCE_DATA']['AUTH_SOURCE_IDENTIFIER_FOR_USER']) ? ' - Identifier: '.$aData['AUTH_SOURCE_DATA']['AUTH_SOURCE_IDENTIFIER_FOR_USER'] : ''; @@ -106,7 +106,7 @@ class AuthenticationSource extends BaseAuthenticationSource { $authSourceEnabledTLS = isset($aData['AUTH_SOURCE_ENABLED_TLS']) ? ' - TLS: '.$aData['AUTH_SOURCE_ENABLED_TLS'] : ''; $authSourceVersion = isset($aData['AUTH_SOURCE_VERSION']) ? ' - Version: '.$aData['AUTH_SOURCE_VERSION'] : ''; $authSourceBaseDn = isset($aData['AUTH_SOURCE_BASE_DN']) ? ' - BaseDN: '.$aData['AUTH_SOURCE_BASE_DN'] : ''; - $authAnonymous = $aData['AUTH_ANONYMOUS'] = 1? ' - Anonymous: YES' : ' - Anonymous: NO'; + $authAnonymous = $aData['AUTH_ANONYMOUS'] == 1? ' - Anonymous: YES' : ' - Anonymous: NO'; $authSourceSearchUser = isset($aData['AUTH_SOURCE_SEARCH_USER']) ? ' - Search User: '. $aData['AUTH_SOURCE_SEARCH_USER'] : ''; $authSourceLdapType = isset($aData['AUTH_SOURCE_DATA']['LDAP_TYPE']) ? ' - LDAP type: '.$aData['AUTH_SOURCE_DATA']['LDAP_TYPE'] : ''; $authSourceIdentifier = isset($aData['AUTH_SOURCE_DATA']['AUTH_SOURCE_IDENTIFIER_FOR_USER']) ? ' - Identifier: '.$aData['AUTH_SOURCE_DATA']['AUTH_SOURCE_IDENTIFIER_FOR_USER'] : ''; @@ -158,7 +158,7 @@ class AuthenticationSource extends BaseAuthenticationSource { $oConnection->begin(); $iResult = $oAuthenticationSource->delete(); $oConnection->commit(); - + G::auditLog("DeleteAuthSource", "Authentication Source Name: ".$authenticationSource['AUTH_SOURCE_NAME']." Authentication Source ID: (".$sUID.") "); return $iResult; } @@ -171,7 +171,7 @@ class AuthenticationSource extends BaseAuthenticationSource { throw($oError); } } - + //Added By Enrique Ponce de Leon //Gets Criteria to fill grid of authentication source function getAuthenticationSources($start,$limit,$filter=''){ @@ -181,7 +181,7 @@ class AuthenticationSource extends BaseAuthenticationSource { if ($filter!=''){ $oCriteria->add(AuthenticationSourcePeer::AUTH_SOURCE_NAME,'%'.$filter.'%',Criteria::LIKE); } - + $oCriteria2 = new Criteria('rbac'); $oCriteria2->addSelectColumn('*'); $oCriteria2->add(AuthenticationSourcePeer::AUTH_SOURCE_UID,'',Criteria::NOT_EQUAL); @@ -190,13 +190,13 @@ class AuthenticationSource extends BaseAuthenticationSource { } $oCriteria2->setLimit($limit); $oCriteria2->setOffset($start); - + $result = array(); $result['COUNTER'] = $oCriteria; $result['LIST'] = $oCriteria2; return $result; } - + function getAllAuthSourcesByUser(){ $oCriteria = new Criteria('rbac'); $oCriteria->addSelectColumn(RbacUsersPeer::USR_UID); @@ -204,10 +204,10 @@ class AuthenticationSource extends BaseAuthenticationSource { $oCriteria->addSelectColumn(AuthenticationSourcePeer::AUTH_SOURCE_PROVIDER); $oCriteria->add(RbacUsersPeer::USR_STATUS,0,Criteria::NOT_EQUAL); $oCriteria->addJoin(RbacUsersPeer::UID_AUTH_SOURCE, AuthenticationSourcePeer::AUTH_SOURCE_UID, Criteria::INNER_JOIN); - + $oDataset = RbacUsersPeer::doSelectRS($oCriteria); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - + $aAuth = array(); while($oDataset->next()){ $row = $oDataset->getRow(); @@ -215,5 +215,5 @@ class AuthenticationSource extends BaseAuthenticationSource { } return $aAuth; } - + } // AuthenticationSource \ No newline at end of file From 051e6b3bea75df730c7a3932f5d2b1c6708e36d4 Mon Sep 17 00:00:00 2001 From: Julio Cesar Laura Date: Fri, 14 Nov 2014 10:38:10 -0400 Subject: [PATCH 15/22] Little js error when import a process using IE10 --- workflow/engine/templates/processes/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/templates/processes/main.js b/workflow/engine/templates/processes/main.js index 96b8a7a63..0d382edd6 100755 --- a/workflow/engine/templates/processes/main.js +++ b/workflow/engine/templates/processes/main.js @@ -1207,7 +1207,7 @@ importProcess = function() Ext.MessageBox.show({ title : '', - msg : resp_.catchMessage, + msg : resp.catchMessage, buttons : Ext.MessageBox.OK, animEl : 'mb9', fn : function(){}, From 4aaeb635607a7543489923c08629cb1f5bc0f1db Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Mon, 17 Nov 2014 16:20:33 -0400 Subject: [PATCH 16/22] PM 808 "Por cada primary key se muestra un..." SOLVED Code Issue: Por cada primary key se muestra un "The field 3 is required." Solution: Se agrega validacion para mostrar la cantidad de campos requeridos en el mensaje que se muestra. --- workflow/engine/templates/pmTables/data.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/workflow/engine/templates/pmTables/data.js b/workflow/engine/templates/pmTables/data.js index e082b9faa..75aa13b23 100755 --- a/workflow/engine/templates/pmTables/data.js +++ b/workflow/engine/templates/pmTables/data.js @@ -124,8 +124,12 @@ Ext.onReady(function(){ _fields.push({name: _idProperty}); + var countFieldsRequired = 0; + for (i=0;i Date: Tue, 18 Nov 2014 16:53:07 -0400 Subject: [PATCH 17/22] EventMessages --- workflow/engine/templates/designer/index.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/workflow/engine/templates/designer/index.html b/workflow/engine/templates/designer/index.html index 86073b2fe..1bb60caac 100644 --- a/workflow/engine/templates/designer/index.html +++ b/workflow/engine/templates/designer/index.html @@ -132,6 +132,10 @@ +
  • + + +
  • From bdb5526507eff5d8e12bf39ef50b82dde8440040 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Wed, 19 Nov 2014 16:15:49 -0400 Subject: [PATCH 18/22] PM 934 "Adicionar support file generation al..." SOLVED Code Issue: Adicionar support file generation al enterprise plugin 2.0.41. Solution: - Sea agregado el indice "countWorkspace" que indica el numero de workspaces; este cambio se hizo para el branch master --- workflow/engine/controllers/adminProxy.php | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow/engine/controllers/adminProxy.php b/workflow/engine/controllers/adminProxy.php index fb835c70a..da05f8c11 100644 --- a/workflow/engine/controllers/adminProxy.php +++ b/workflow/engine/controllers/adminProxy.php @@ -1488,6 +1488,7 @@ class adminProxy extends HttpProxyController //Country/city (Timezone) $params["Timezone"] = (defined('TIME_ZONE') && TIME_ZONE != "Unknown") ? TIME_ZONE : date_default_timezone_get(); + $params["countWorkspace"] = count(System::listWorkspaces()); $support = PATH_DATA_SITE . G::sanitizeString($licenseManager->info['FIRST_NAME'] . '-' . $licenseManager->info['LAST_NAME'] . '-' . SYS_SYS . '-' . date('YmdHis'), false, false) . '.spm'; file_put_contents($support, serialize($params)); From 8ddabd73db4a4acdf4e7512dff6ef21f6c00c06c Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Wed, 19 Nov 2014 16:47:22 -0400 Subject: [PATCH 19/22] PM-473 "Analisis de los resultados de escaneo de las..." SOLVED Issue: Analisis de los resultados de escaneo de las funciones en ProcessMaker. Plugin/trigger code scanner. Cause: Nueva solicitud de funciones Solution: Se ha implementado esta nueva funcionalidad, que consta de lo siguiente: - Escaneo de codigo al importar un plugin (no se aplica a plugins enterprise) - Escaneo de codigo al habilitar un plugin (si el plugin ya se encuentra fisicamente en el directorio de los plugins) - Escaneo de codigo al importar un proceso - Escaneo de codigo al crear/modificar codigo de un trigger - Escaneo de codigo al ejecutar un caso que tenga seteados triggers en sus steps (si el trigger tiene codigo no deseado, no se ejecuta el trigger) - Se ha agregado la opcion "check-plugin-disabled-code" al comando "./gulliver", el mismo muestra informacion sobre los plugins con codigo no deseado. Ej: $ ./gulliver check-plugin-disabled-code [enterprise-plugin|custom-plugin|all|] - Se ha agregado la opcion "check-workspace-disabled-code" al comando "./processmaker", el mismo muestra informacion sobre los workspaces con codigo no deseado en sus triggers. Ej: $ ./processmaker check-workspace-disabled-code - Por defecto ProcessMaker no realiza el escaneo de codigo, si se desea escanear codigo no deseado, se debera definir el atributo "enable_blacklist = 1" en el archivo "env.ini", este atributo no se aplica a las nuevas opciones creadas para los comandos "./gulliver" y "./processmaker" - Para una configuracion personalizada de codigo no deseado (lista negra), se pueden definir las mismas en el archivo "path/to/processmaker/workflow/engine/config/blacklist.ini" (si no existe el archivo se puede crear), o tambien en el atributo "disable_functions" esto en el archivo "php.ini" Ejemplo de "blacklist.ini": ;Classes ;======= DashletInterface ;Functions ;========= eval exec ;date ;echo strlen --- gulliver/bin/tasks/pakeGulliver.php | 119 ++++++++++ gulliver/system/class.codeScanner.php | 218 ++++++++++++++++++ workflow/engine/bin/tasks/cliWorkspaces.php | 70 +++++- workflow/engine/classes/class.case.php | 54 ++++- workflow/engine/classes/class.processes.php | 97 ++++++++ workflow/engine/classes/class.wsTools.php | 24 +- workflow/engine/classes/model/AppHistory.php | 2 +- .../processes/processes_Import_Ajax.php | 79 ++++++- .../engine/methods/setup/pluginsChange.php | 40 +++- .../methods/setup/pluginsImportFile.php | 18 +- .../engine/methods/triggers/triggers_Save.php | 47 +++- workflow/engine/templates/processes/main.js | 13 ++ .../engine/templates/setup/pluginsMain.js | 13 +- .../engine/xmlform/triggers/triggers_Edit.xml | 44 +++- 14 files changed, 784 insertions(+), 54 deletions(-) create mode 100644 gulliver/system/class.codeScanner.php diff --git a/gulliver/bin/tasks/pakeGulliver.php b/gulliver/bin/tasks/pakeGulliver.php index c4459e6bf..57b1dfa7a 100755 --- a/gulliver/bin/tasks/pakeGulliver.php +++ b/gulliver/bin/tasks/pakeGulliver.php @@ -52,6 +52,9 @@ pake_task('new-plugin', 'project_exists'); pake_desc("Update the plugin attributes in all workspaces\n args: "); pake_task("update-plugin-attributes", "project_exists"); +pake_desc("Check disabled code in plugins\n args: [enterprise-plugin|custom-plugin|all|]"); +pake_task("check-plugin-disabled-code", "project_exists"); + pake_desc("pack plugin in .tar file \n args: "); pake_task('pack-plugin', 'project_exists'); @@ -2641,3 +2644,119 @@ function run_update_plugin_attributes($task, $args) } } +function run_check_plugin_disabled_code($task, $args) +{ + try { + //Set variables + $option = (isset($args[0]))? trim($args[0]) : ""; + $option2 = strtoupper($option); + + switch ($option2) { + case "ENTERPRISE-PLUGIN": + break; + case "CUSTOM-PLUGIN": + case "ALL": + case "": + break; + default: + //PLUGIN-NAME + $option2 = "PLUGIN-NAME"; + break; + } + + if (is_dir(PATH_PLUGINS)) { + if ($dirh = opendir(PATH_PLUGINS)) { + G::LoadClass("system"); + + require_once("propel" . PATH_SEP . "Propel.php"); + require_once(PATH_CORE . "methods" . PATH_SEP . "enterprise" . PATH_SEP . "enterprise.php"); + + Propel::init(PATH_CORE . "config" . PATH_SEP . "databases.php"); + + $arrayData = array(); + + while (($file = readdir($dirh)) !== false) { + if (preg_match("/^.+\.php$/", $file)) { + $pluginName = str_replace(".php", "", $file); + + if (is_file(PATH_PLUGINS . $pluginName . ".php") && is_dir(PATH_PLUGINS . $pluginName)) { + require_once(PATH_PLUGINS . $pluginName . ".php"); + + $pluginClassName = $pluginName . "Plugin"; + + $p = new $pluginClassName(); + + switch ($option2) { + case "ENTERPRISE-PLUGIN": + if (get_parent_class($p) == "enterprisePlugin") { + $arrayData[] = $pluginName; + } + break; + case "CUSTOM-PLUGIN": + case "ALL": + case "": + if (get_parent_class($p) == "PMPlugin") { + $arrayData[] = $pluginName; + } + break; + default: + //PLUGIN-NAME + if ($pluginName == $option) { + $arrayData[] = $pluginName; + } + break; + } + } + } + } + + closedir($dirh); + + //Verify data + if ($option2 == "PLUGIN-NAME" && count($arrayData) == 0) { + throw new Exception("Error: The plugin does not exist"); + } + + //Check disabled code + if (count($arrayData) > 0) { + G::LoadClass("codeScanner"); + + $cs = new CodeScanner("DISABLED_CODE"); + + $strFoundDisabledCode = ""; + + foreach ($arrayData as $value) { + $pluginName = $value; + + $arrayFoundDisabledCode = array_merge($cs->checkDisabledCode("FILE", PATH_PLUGINS . $pluginName . ".php"), $cs->checkDisabledCode("PATH", PATH_PLUGINS . $pluginName)); + + if (count($arrayFoundDisabledCode) > 0) { + $strFoundDisabledCode .= (($strFoundDisabledCode != "")? "\n\n" : "") . "> " . $pluginName; + + foreach ($arrayFoundDisabledCode as $key2 => $value2) { + $strCodeAndLine = ""; + + foreach ($value2 as $key3 => $value3) { + $strCodeAndLine .= (($strCodeAndLine != "")? ", " : "") . $key3 . " (Lines " . implode(", ", $value3) . ")"; + } + + $strFoundDisabledCode .= "\n- " . str_replace(PATH_PLUGINS, "", $key2) . ": " . $strCodeAndLine; + } + } + } + + if ($strFoundDisabledCode != "") { + echo "The next plugins have the following unwanted code (this code should be removed):\n\n" . $strFoundDisabledCode . "\n\n"; + } else { + echo "The plugin(s) it's OK\n\n"; + } + } + } + } + + echo "Done!\n"; + } catch (Exception $e) { + echo $e->getMessage() . "\n"; + } +} + diff --git a/gulliver/system/class.codeScanner.php b/gulliver/system/class.codeScanner.php new file mode 100644 index 000000000..6a81881eb --- /dev/null +++ b/gulliver/system/class.codeScanner.php @@ -0,0 +1,218 @@ +setArrayDisabledCode(); + break; + } + } catch (Exception $e) { + throw $e; + } + } + + /** + * Set disabled code + * + * return void + */ + public function setArrayDisabledCode() + { + try { + //Disabled functions (PHP) + $disableFunctions = ini_get("disable_functions"); + + if ($disableFunctions != "") { + $this->arrayDisabledCode = array_filter(array_map("trim", explode(",", $disableFunctions))); + } + + //Disabled code (blacklist) + $fileDisabledCode = PATH_CONFIG . "blacklist.ini"; + + if (file_exists($fileDisabledCode)) { + $arrayAux = array_filter(array_map("trim", file($fileDisabledCode, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES))); + $arrayAux = array_filter($arrayAux, create_function("\$line", "return !preg_match(\"/^;.*\$/\", \$line);")); + + $this->arrayDisabledCode = array_unique(array_merge($this->arrayDisabledCode, $arrayAux)); + } + } catch (Exception $e) { + throw $e; + } + } + + /** + * Get disabled code + * + * return array Return array with disabled code + */ + public function getArrayDisabledCode() + { + try { + return $this->arrayDisabledCode; + } catch (Exception $e) { + throw $e; + } + } + + /** + * Verify if exists disabled code + * + * return bool Return true if exists disabled code, false otherwise + */ + public function existsDisabledCode() + { + try { + return count($this->arrayDisabledCode) > 0; + } catch (Exception $e) { + throw $e; + } + } + + /** + * Check disabled code in Source + * + * @param string $source Source + * + * return array Return array with disabled code found, array empty otherwise + */ + public function checkDisabledCodeInSource($source) + { + try { + if (!$this->existsDisabledCode()) { + //Return + return array(); + } + + if (trim($source) == "") { + //Return + return array(); + } + + //Search code + $arrayFoundCode = array(); + + $arrayDisabledTokenAux = array( + T_COMMENT, //// or #, and /* */ //Comments + T_ML_COMMENT, + T_DOC_COMMENT, ///** */ //PHPDoc style comments + T_VARIABLE, //$foo //Variables + T_CONSTANT_ENCAPSED_STRING, //"foo" or 'bar' //String syntax + T_DOUBLE_ARROW, //=> //Array syntax + T_OBJECT_OPERATOR //-> //Classes and objects + ); + + $arrayToken = token_get_all("arrayDisabledCode as $value2) { + $code = $value2; + + if (preg_match("/^" . $code . "$/i", trim($text))) { + $arrayFoundCode[$code][$lineNumber - 1] = $lineNumber - 1; + break; + } + } + } + } + } + + ksort($arrayFoundCode); + + //Return + return $arrayFoundCode; + } catch (Exception $e) { + throw $e; + } + } + + /** + * Check disabled code + * + * @param string $option Option (SOURCE, PATH, FILE) + * @param string $data Data + * + * return array Return array with disabled code found, array empty otherwise + */ + public function checkDisabledCode($option, $data) + { + try { + if (!$this->existsDisabledCode()) { + //Return + return array(); + } + + //Search code + $arrayFoundCode = array(); + + switch ($option) { + case "SOURCE": + $source = $data; + + $arrayAux = $this->checkDisabledCodeInSource($source); + + if (count($arrayAux) > 0) { + $arrayFoundCode["source"] = $arrayAux; + } + break; + case "PATH": + case "FILE": + $path = $data; + + if (is_dir($path)) { + if ($dirh = opendir($path)) { + while (($file = readdir($dirh)) !== false) { + if ($file != "" && $file != "." && $file != "..") { + $f = $path . PATH_SEP . $file; + + $arrayFoundCode = array_merge($arrayFoundCode, $this->checkDisabledCode((is_dir($f))? "PATH" : "FILE", $f)); + } + } + + closedir($dirh); + } + } else { + if (preg_match("/\.php$/", $path)) { + $source = file_get_contents($path); + + $arrayAux = $this->checkDisabledCodeInSource($source); + + if (count($arrayAux) > 0) { + $arrayFoundCode[$path] = $arrayAux; + } + } + } + break; + } + + //Return + return $arrayFoundCode; + } catch (Exception $e) { + throw $e; + } + } +} + diff --git a/workflow/engine/bin/tasks/cliWorkspaces.php b/workflow/engine/bin/tasks/cliWorkspaces.php index d89727167..1b1bc3106 100755 --- a/workflow/engine/bin/tasks/cliWorkspaces.php +++ b/workflow/engine/bin/tasks/cliWorkspaces.php @@ -174,7 +174,7 @@ CLI::taskRun("runStructureDirectories"); CLI::taskName("database-generate-self-service-by-value"); CLI::taskDescription(<<name) . ": " . CLI::error($e->getMessage()) . "\n"; } + + echo "\n"; } + + echo "Done!\n"; + } catch (Exception $e) { + echo CLI::error($e->getMessage()) . "\n"; + } +} + +function run_check_workspace_disabled_code($args, $opts) +{ + try { + $arrayWorkspace = get_workspaces_from_args($args); + + foreach ($arrayWorkspace as $value) { + $workspace = $value; + + echo "> Workspace: " . $workspace->name . "\n"; + + try { + $arrayFoundDisabledCode = $workspace->getDisabledCode(); + + if (count($arrayFoundDisabledCode) > 0) { + $strFoundDisabledCode = ""; + + foreach ($arrayFoundDisabledCode as $value2) { + $arrayProcessData = $value2; + + $strFoundDisabledCode .= ($strFoundDisabledCode != "")? "\n" : ""; + $strFoundDisabledCode .= " Process: " . $arrayProcessData["processTitle"] . "\n"; + $strFoundDisabledCode .= " Triggers:\n"; + + foreach ($arrayProcessData["triggers"] as $value3) { + $arrayTriggerData = $value3; + + $strCodeAndLine = ""; + + foreach ($arrayTriggerData["disabledCode"] as $key4 => $value4) { + $strCodeAndLine .= (($strCodeAndLine != "")? ", " : "") . $key4 . " (Lines " . implode(", ", $value4) . ")"; + } + + $strFoundDisabledCode .= " - " . $arrayTriggerData["triggerTitle"] . ": " . $strCodeAndLine . "\n"; + } + } + + echo $strFoundDisabledCode . "\n"; + } else { + echo "The workspace it's OK\n\n"; + } + } catch (Exception $e) { + echo "Errors to check disabled code: " . CLI::error($e->getMessage()) . "\n\n"; + } + } + + echo "Done!\n"; } catch (Exception $e) { echo CLI::error($e->getMessage()) . "\n"; } diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index a0966d2f3..d9441f9e2 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -3234,12 +3234,23 @@ class Cases } else { $sStepUid = $sStepUidObj; } + + $delimiter = DBAdapter::getStringDelimiter(); + $c = new Criteria(); $c->clearSelectColumns(); $c->addSelectColumn(TriggersPeer::TRI_UID); + $c->addAsColumn("TRI_TITLE", ContentPeer::CON_VALUE); $c->addSelectColumn(StepTriggerPeer::ST_CONDITION); $c->addSelectColumn(TriggersPeer::TRI_TYPE); $c->addSelectColumn(TriggersPeer::TRI_WEBBOT); + + $arrayCondition = array(); + $arrayCondition[] = array(TriggersPeer::TRI_UID, ContentPeer::CON_ID, Criteria::EQUAL); + $arrayCondition[] = array(ContentPeer::CON_CATEGORY, $delimiter . "TRI_TITLE" . $delimiter, Criteria::EQUAL); + $arrayCondition[] = array(ContentPeer::CON_LANG, $delimiter . SYS_LANG . $delimiter, Criteria::EQUAL); + $c->addJoinMC($arrayCondition, Criteria::LEFT_JOIN); + $c->add(StepTriggerPeer::STEP_UID, $sStepUid); $c->add(StepTriggerPeer::TAS_UID, $sTasUid); $c->add(StepTriggerPeer::ST_TYPE, $sTriggerType); @@ -3247,13 +3258,13 @@ class Cases $c->addAscendingOrderByColumn(StepTriggerPeer::ST_POSITION); $rs = TriggersPeer::doSelectRS($c); $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $rs->next(); - $row = $rs->getRow(); - while (is_array($row)) { - $aTriggers[] = $row; - $rs->next(); + + while ($rs->next()) { $row = $rs->getRow(); + + $aTriggers[] = $row; } + return $aTriggers; } @@ -3270,22 +3281,55 @@ class Cases public function executeTriggers($sTasUid, $sStepType, $sStepUidObj, $sTriggerType, $aFields = array()) { + G::LoadClass("codeScanner"); + $aTriggers = $this->loadTriggers($sTasUid, $sStepType, $sStepUidObj, $sTriggerType); + if (count($aTriggers) > 0) { global $oPMScript; + $oPMScript = new PMScript(); $oPMScript->setFields($aFields); + + $arraySystemConfiguration = System::getSystemConfiguration(PATH_CONFIG . "env.ini"); + + $cs = new CodeScanner((isset($arraySystemConfiguration["enable_blacklist"]) && (int)($arraySystemConfiguration["enable_blacklist"]) == 1)? "DISABLED_CODE" : ""); + + $strFoundDisabledCode = ""; + foreach ($aTriggers as $aTrigger) { + //Check disabled code + $arrayFoundDisabledCode = $cs->checkDisabledCode("SOURCE", $aTrigger["TRI_WEBBOT"]); + + if (count($arrayFoundDisabledCode) > 0) { + $strCodeAndLine = ""; + + foreach ($arrayFoundDisabledCode["source"] as $key => $value) { + $strCodeAndLine .= (($strCodeAndLine != "")? ", " : "") . G::LoadTranslation("ID_DISABLED_CODE_CODE_AND_LINE", array($key, implode(", ", $value))); + } + + $strFoundDisabledCode .= "
    - " . $aTrigger["TRI_TITLE"] . ": " . $strCodeAndLine; + continue; + } + + //Execute $bExecute = true; + if ($aTrigger['ST_CONDITION'] !== '') { $oPMScript->setScript($aTrigger['ST_CONDITION']); $bExecute = $oPMScript->evaluate(); } + if ($bExecute) { $oPMScript->setScript($aTrigger['TRI_WEBBOT']); $oPMScript->execute(); } } + + if ($strFoundDisabledCode != "") { + G::SendTemporalMessage(G::LoadTranslation("ID_DISABLED_CODE_TRIGGER_TO_EXECUTE", array($strFoundDisabledCode)), "", "string"); + } + return $oPMScript->aFields; } else { return $aFields; diff --git a/workflow/engine/classes/class.processes.php b/workflow/engine/classes/class.processes.php index 90114a760..6606112b4 100755 --- a/workflow/engine/classes/class.processes.php +++ b/workflow/engine/classes/class.processes.php @@ -4420,6 +4420,103 @@ class Processes throw ($oError); } } + + /** + * Get disabled code + * + * @param string $processUid Unique id of Process + * + * return array Return array with disabled code found, array empty otherwise + */ + public function getDisabledCode($processUid = "") + { + try { + G::LoadClass("codeScanner"); + + $arrayDisabledCode = array(); + + //Set variables + $cs = new CodeScanner("DISABLED_CODE"); + + $delimiter = DBAdapter::getStringDelimiter(); + + //Processes + $criteria = new Criteria("workflow"); + + $criteria->addSelectColumn(ProcessPeer::PRO_UID); + $criteria->addAsColumn("PRO_TITLE", ContentPeer::CON_VALUE); + + $arrayCondition = array(); + $arrayCondition[] = array(ProcessPeer::PRO_UID, ContentPeer::CON_ID, Criteria::EQUAL); + $arrayCondition[] = array(ContentPeer::CON_CATEGORY, $delimiter . "PRO_TITLE" . $delimiter, Criteria::EQUAL); + $arrayCondition[] = array(ContentPeer::CON_LANG, $delimiter . SYS_LANG . $delimiter, Criteria::EQUAL); + $criteria->addJoinMC($arrayCondition, Criteria::LEFT_JOIN); + + if ($processUid != "") { + $criteria->add(ProcessPeer::PRO_UID, $processUid, Criteria::EQUAL); + } + + $rsCriteria = ProcessPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + while ($rsCriteria->next()) { + $row = $rsCriteria->getRow(); + + $processUid = $row["PRO_UID"]; + $processTitle = $row["PRO_TITLE"]; + + //Triggers + $criteriaTrigger = new Criteria("workflow"); + + $criteriaTrigger->addSelectColumn(TriggersPeer::TRI_UID); + $criteriaTrigger->addAsColumn("TRI_TITLE", ContentPeer::CON_VALUE); + $criteriaTrigger->addSelectColumn(TriggersPeer::TRI_WEBBOT); + + $arrayCondition = array(); + $arrayCondition[] = array(TriggersPeer::TRI_UID, ContentPeer::CON_ID, Criteria::EQUAL); + $arrayCondition[] = array(ContentPeer::CON_CATEGORY, $delimiter . "TRI_TITLE" . $delimiter, Criteria::EQUAL); + $arrayCondition[] = array(ContentPeer::CON_LANG, $delimiter . SYS_LANG . $delimiter, Criteria::EQUAL); + $criteriaTrigger->addJoinMC($arrayCondition, Criteria::LEFT_JOIN); + + $criteriaTrigger->add(TriggersPeer::PRO_UID, $processUid, Criteria::EQUAL); + + $rsCriteriaTrigger = TriggersPeer::doSelectRS($criteriaTrigger); + $rsCriteriaTrigger->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + while ($rsCriteriaTrigger->next()) { + $row = $rsCriteriaTrigger->getRow(); + + $triggerUid = $row["TRI_UID"]; + $triggerTitle = $row["TRI_TITLE"]; + $triggerWebbot = $row["TRI_WEBBOT"]; + + //Check disabled code + $arrayFoundDisabledCode = $cs->checkDisabledCode("SOURCE", $triggerWebbot); + + if (count($arrayFoundDisabledCode) > 0) { + if (!isset($arrayDisabledCode[$processUid])) { + $arrayDisabledCode[$processUid] = array( + "processUid" => $processUid, + "processTitle" => $processTitle, + "triggers" => array() + ); + } + + $arrayDisabledCode[$processUid]["triggers"][] = array( + "triggerUid" => $triggerUid, + "triggerTitle" => $triggerTitle, + "disabledCode" => $arrayFoundDisabledCode["source"], + ); + } + } + } + + //Return + return $arrayDisabledCode; + } catch (Exception $e) { + throw $e; + } + } } //end class processes diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index 963b534d9..0324f447a 100755 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -1551,7 +1551,7 @@ class workspaceTools foreach ($metadata->databases as $db) { if ($dbName != $newDBNames[$db->name]) { $dbName = $newDBNames[$db->name]; - + if (mysql_select_db($dbName, $link)) { if(!$overwrite) { throw new Exception("Destination Database already exist (use -o to overwrite)"); @@ -1819,4 +1819,26 @@ class workspaceTools throw $e; } } + + /** + * Get disabled code + * + * return array Return array with disabled code found, array empty otherwise + */ + public function getDisabledCode() + { + try { + $this->initPropel(true); + + G::LoadClass("processes"); + + $process = new Processes(); + + //Return + return $process->getDisabledCode(); + } catch (Exception $e) { + throw $e; + } + } } + diff --git a/workflow/engine/classes/model/AppHistory.php b/workflow/engine/classes/model/AppHistory.php index a18cc2901..23e069d00 100755 --- a/workflow/engine/classes/model/AppHistory.php +++ b/workflow/engine/classes/model/AppHistory.php @@ -165,7 +165,7 @@ class AppHistory extends BaseAppHistory $title = $arrayOutputDocumentData["OUT_DOC_TITLE"] . " (" . G::LoadTranslation("ID_OUTPUT_DOCUMENT") . ")"; break; case "ASSIGN_TASK": - $title = G::LoadTranslation("ASSIGN_TASK") . " (" . G::LoadTranslation("ID_TRIGGERS") . ")"; + $title = G::LoadTranslation("ID_ASSIGN_TASK") . " (" . G::LoadTranslation("ID_TRIGGERS") . ")"; break; } diff --git a/workflow/engine/methods/processes/processes_Import_Ajax.php b/workflow/engine/methods/processes/processes_Import_Ajax.php index a2fc0f038..349fcfee3 100644 --- a/workflow/engine/methods/processes/processes_Import_Ajax.php +++ b/workflow/engine/methods/processes/processes_Import_Ajax.php @@ -26,6 +26,63 @@ use ProcessMaker\Importer\XmlImporter; ini_set("max_execution_time", 0); +if (isset($_FILES["PROCESS_FILENAME"]) && + pathinfo($_FILES["PROCESS_FILENAME"]["name"], PATHINFO_EXTENSION) == "pm" && + $_FILES["PROCESS_FILENAME"]["error"] == 0 +) { + //Check disabled code + $response = array(); + + try { + $fh = fopen($_FILES["PROCESS_FILENAME"]["tmp_name"], "rb"); + $content = fread($fh, (int)(fread($fh, 9))); + $data = unserialize($content); + fclose($fh); + + if (is_object($data) && isset($data->triggers) && is_array($data->triggers) && count($data->triggers) > 0) { + G::LoadClass("codeScanner"); + + $arraySystemConfiguration = System::getSystemConfiguration(PATH_CONFIG . "env.ini"); + + $cs = new CodeScanner((isset($arraySystemConfiguration["enable_blacklist"]) && (int)($arraySystemConfiguration["enable_blacklist"]) == 1)? "DISABLED_CODE" : ""); + + $strFoundDisabledCode = ""; + + foreach ($data->triggers as $value) { + $arrayTriggerData = $value; + + $arrayFoundDisabledCode = $cs->checkDisabledCode("SOURCE", $arrayTriggerData["TRI_WEBBOT"]); + + if (count($arrayFoundDisabledCode) > 0) { + $strCodeAndLine = ""; + + foreach ($arrayFoundDisabledCode["source"] as $key2 => $value2) { + $strCodeAndLine .= (($strCodeAndLine != "")? ", " : "") . G::LoadTranslation("ID_DISABLED_CODE_CODE_AND_LINE", array($key2, implode(", ", $value2))); + } + + $strFoundDisabledCode .= (($strFoundDisabledCode != "")? "\n" : "") . "- " . $arrayTriggerData["TRI_TITLE"] . ": " . $strCodeAndLine; + } + } + + if ($strFoundDisabledCode != "") { + $response["status"] = "DISABLED-CODE"; + $response["success"] = true; + $response["message"] = G::LoadTranslation("ID_DISABLED_CODE_PROCESS", array($data->process["PRO_TITLE"], "\n" . $strFoundDisabledCode)); + + echo G::json_encode($response); + exit(0); + } + } + } catch (Exception $e) { + $response["status"] = "ERROR"; + $response["success"] = true; + $response["catchMessage"] = $e->getMessage(); + + echo G::json_encode($response); + exit(0); + } +} + if (isset($_FILES["PROCESS_FILENAME"]) && pathinfo($_FILES["PROCESS_FILENAME"]["name"], PATHINFO_EXTENSION) == "pmx" ) { @@ -286,17 +343,17 @@ if ($action == "uploadFileNewProcessExist") { $importer->throwExceptionIfExistsReservedWordsSql($oData); - //**cheking if the PRO_CREATE_USER exist**// - $usrCrtr = $oData->process['PRO_CREATE_USER']; - - $exist = new Users(); - if($exist->userExists($usrCrtr)){ - $usrInfo = $exist->getAllInformation($usrCrtr); - if ($usrInfo['status'] == 'CLOSED'){ - $oData->process['PRO_CREATE_USER'] = $_SESSION['USER_LOGGED']; - } - } else { - $oData->process['PRO_CREATE_USER'] = $_SESSION['USER_LOGGED']; + //**cheking if the PRO_CREATE_USER exist**// + $usrCrtr = $oData->process['PRO_CREATE_USER']; + + $exist = new Users(); + if($exist->userExists($usrCrtr)){ + $usrInfo = $exist->getAllInformation($usrCrtr); + if ($usrInfo['status'] == 'CLOSED'){ + $oData->process['PRO_CREATE_USER'] = $_SESSION['USER_LOGGED']; + } + } else { + $oData->process['PRO_CREATE_USER'] = $_SESSION['USER_LOGGED']; } $Fields['PRO_FILENAME'] = $filename; diff --git a/workflow/engine/methods/setup/pluginsChange.php b/workflow/engine/methods/setup/pluginsChange.php index 27fec35fc..68895a2f2 100755 --- a/workflow/engine/methods/setup/pluginsChange.php +++ b/workflow/engine/methods/setup/pluginsChange.php @@ -43,16 +43,38 @@ if ($handle = opendir( PATH_PLUGINS )) { $oPluginRegistry->disablePlugin( $details->sNamespace ); $size = file_put_contents( PATH_DATA_SITE . 'plugin.singleton', $oPluginRegistry->serializeInstance() ); G::auditLog("DisablePlugin", "Plugin Name: ".$details->sNamespace); - print "size saved : $size
    "; + //print "size saved : $size
    "; } else { - //print "change to ENABLED"; - require_once (PATH_PLUGINS . $pluginFile); - $details = $oPluginRegistry->getPluginDetails( $pluginFile ); - $oPluginRegistry->enablePlugin( $details->sNamespace ); - $oPluginRegistry->setupPlugins(); //get and setup enabled plugins - $size = file_put_contents( PATH_DATA_SITE . 'plugin.singleton', $oPluginRegistry->serializeInstance() ); - G::auditLog("EnablePlugin", "Plugin Name: ".$details->sNamespace); - print "size saved : $size
    "; + $pluginName = str_replace(".php", "", $pluginFile); + + if (is_file(PATH_PLUGINS . $pluginName . ".php") && is_dir(PATH_PLUGINS . $pluginName)) { + //Check disabled code + G::LoadClass("codeScanner"); + + $arraySystemConfiguration = System::getSystemConfiguration(PATH_CONFIG . "env.ini"); + + $cs = new CodeScanner((isset($arraySystemConfiguration["enable_blacklist"]) && (int)($arraySystemConfiguration["enable_blacklist"]) == 1)? "DISABLED_CODE" : ""); + + $arrayFoundDisabledCode = array_merge($cs->checkDisabledCode("FILE", PATH_PLUGINS . $pluginName . ".php"), $cs->checkDisabledCode("PATH", PATH_PLUGINS . $pluginName)); + + if (count($arrayFoundDisabledCode) > 0) { + $response = array(); + $response["status"] = "DISABLED-CODE"; + $response["message"] = G::LoadTranslation("ID_DISABLED_CODE_PLUGIN"); + + echo G::json_encode($response); + exit(0); + } + + //print "change to ENABLED"; + require_once(PATH_PLUGINS . $pluginFile); + $details = $oPluginRegistry->getPluginDetails($pluginFile); + $oPluginRegistry->enablePlugin($details->sNamespace); + $oPluginRegistry->setupPlugins(); //get and setup enabled plugins + $size = file_put_contents(PATH_DATA_SITE . "plugin.singleton", $oPluginRegistry->serializeInstance()); + G::auditLog("EnablePlugin", "Plugin Name: " . $details->sNamespace); + //print "size saved : $size
    "; + } } } } diff --git a/workflow/engine/methods/setup/pluginsImportFile.php b/workflow/engine/methods/setup/pluginsImportFile.php index 3f3697e64..0f1fca33a 100755 --- a/workflow/engine/methods/setup/pluginsImportFile.php +++ b/workflow/engine/methods/setup/pluginsImportFile.php @@ -162,6 +162,20 @@ try { } $res = $tar->extract( $path ); + //Check disabled code + G::LoadClass("codeScanner"); + + $arraySystemConfiguration = System::getSystemConfiguration(PATH_CONFIG . "env.ini"); + + $cs = new CodeScanner((isset($arraySystemConfiguration["enable_blacklist"]) && (int)($arraySystemConfiguration["enable_blacklist"]) == 1)? "DISABLED_CODE" : ""); + + $arrayFoundDisabledCode = array_merge($cs->checkDisabledCode("FILE", $path . $pluginFile), $cs->checkDisabledCode("PATH", $path . $sClassName)); + + if (count($arrayFoundDisabledCode) > 0) { + throw new Exception(G::LoadTranslation("ID_DISABLED_CODE_PLUGIN")); + } + + //Check if is enterprise plugin $sContent = file_get_contents( $path . $pluginFile ); $chain = preg_quote( 'extends enterprisePlugin' ); if (strpos( $sContent, $chain )) { @@ -237,14 +251,14 @@ try { $oPluginRegistry->setupPlugins(); //get and setup enabled plugins $size = file_put_contents( PATH_DATA_SITE . "plugin.singleton", $oPluginRegistry->serializeInstance() ); - + $response = $oPluginRegistry->verifyTranslation( $details->sNamespace); G::auditLog("InstallPlugin", "Plugin Name: ".$details->sNamespace ); //if ($response->recordsCountSuccess <= 0) { //throw (new Exception( 'The plugin ' . $details->sNamespace . ' couldn\'t verify any translation item. Verified Records:' . $response->recordsCountSuccess)); //} - + G::header( "Location: pluginsMain" ); die(); } catch (Exception $e) { diff --git a/workflow/engine/methods/triggers/triggers_Save.php b/workflow/engine/methods/triggers/triggers_Save.php index 8e66b72fe..5f841c7d1 100755 --- a/workflow/engine/methods/triggers/triggers_Save.php +++ b/workflow/engine/methods/triggers/triggers_Save.php @@ -63,13 +63,17 @@ if (isset( $sfunction ) && $sfunction == 'lookforNameTrigger') { } } - print $flag; - //print'krlos';return ; + + echo $flag; } else { + G::LoadClass("processMap"); + G::LoadClass("codeScanner"); + + $response = array(); + try { $oTrigger = new Triggers(); - G::LoadClass( 'processMap' ); $oProcessMap = new processMap( new DBConnection() ); if (isset( $_POST['form'] )) { $value = $_POST['form']; @@ -77,6 +81,25 @@ if (isset( $sfunction ) && $sfunction == 'lookforNameTrigger') { $value = $_POST; } + if (isset($value["TRI_WEBBOT"])) { + //Check disabled code + $arraySystemConfiguration = System::getSystemConfiguration(PATH_CONFIG . "env.ini"); + + $cs = new CodeScanner((isset($arraySystemConfiguration["enable_blacklist"]) && (int)($arraySystemConfiguration["enable_blacklist"]) == 1)? "DISABLED_CODE" : ""); + + $arrayFoundDisabledCode = $cs->checkDisabledCode("SOURCE", $value["TRI_WEBBOT"]); + + if (count($arrayFoundDisabledCode) > 0) { + $strCodeAndLine = ""; + + foreach ($arrayFoundDisabledCode["source"] as $key => $value) { + $strCodeAndLine .= (($strCodeAndLine != "")? ", " : "") . G::LoadTranslation("ID_DISABLED_CODE_CODE_AND_LINE", array($key, implode(", ", $value))); + } + + throw new Exception(G::LoadTranslation("ID_DISABLED_CODE_TRIGGER", array($strCodeAndLine))); + } + } + if ($value['TRI_UID'] != '') { $oTrigger->load( $value['TRI_UID'] ); } else { @@ -86,15 +109,17 @@ if (isset( $sfunction ) && $sfunction == 'lookforNameTrigger') { //print_r($_POST['form']);die; $oTrigger->update( $value ); - if (! isset( $_POST['mode'] )) { - $oProcessMap->triggersList( $value['PRO_UID'] ); - } - $result->success = true; - $result->msg = G::LoadTranslation( 'ID_TRIGGERS_SAVED' ); + //if (! isset( $_POST['mode'] )) { + // $oProcessMap->triggersList( $value['PRO_UID'] ); + //} + + $response["success"] = true; + $response["msg"] = G::LoadTranslation("ID_TRIGGERS_SAVED"); } catch (Exception $e) { - $result->success = false; - $result->msg = $e->getMessage(); + $response["success"] = false; + $response["msg"] = $e->getMessage(); } - print G::json_encode( $result ); + + echo G::json_encode($response); } diff --git a/workflow/engine/templates/processes/main.js b/workflow/engine/templates/processes/main.js index 0d382edd6..84a191951 100755 --- a/workflow/engine/templates/processes/main.js +++ b/workflow/engine/templates/processes/main.js @@ -1166,6 +1166,19 @@ importProcess = function() var resp_ = Ext.util.JSON.decode(resp.response.responseText); + if (resp_.status) { + if (resp_.status == "DISABLED-CODE") { + Ext.MessageBox.show({ + title: _("ID_ERROR"), + msg: "
    " + stringReplace("\\x0A", "
    ", resp_.message) + "
    ", //\n 10 + icon: Ext.MessageBox.ERROR, + buttons: Ext.MessageBox.OK + }); + + return; + } + } + if (resp_.catchMessage == "") { if (resp_.ExistProcessInDatabase == "0") { if (resp_.ExistGroupsInDatabase == "0") { diff --git a/workflow/engine/templates/setup/pluginsMain.js b/workflow/engine/templates/setup/pluginsMain.js index 2b918bbf0..230343eaa 100755 --- a/workflow/engine/templates/setup/pluginsMain.js +++ b/workflow/engine/templates/setup/pluginsMain.js @@ -179,7 +179,7 @@ Ext.onReady(function(){ }); if (typeof(__PLUGIN_ERROR__) !== 'undefined') { - PMExt.notify(_('ID_PLUGINS'), __PLUGIN_ERROR__); + PMExt.notify(_("ID_PLUGINS"), __PLUGIN_ERROR__, "error", 5); } }); @@ -253,7 +253,15 @@ function activeDeactive(){ params : { UIDS : ids }, method: 'GET', success: function ( result, request ) { - //Ext.MessageBox.alert('Success', 'Data return from the server: '+ result.responseText); + var dataResponse = Ext.util.JSON.decode(result.responseText); + + if (dataResponse.status) { + if (dataResponse.status == "DISABLED-CODE") { + PMExt.notify(_("ID_PLUGINS"), dataResponse.message, "error", 5); + return; + } + } + var site = ''; if (SYS_SKIN.substring(0,2) == 'ux') { site = PROCESSMAKER_URL + '/main?st=admin&s='+parent._NODE_SELECTED; @@ -319,3 +327,4 @@ capitalize = function(s){ s = s.toLowerCase(); return s.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } ); }; + diff --git a/workflow/engine/xmlform/triggers/triggers_Edit.xml b/workflow/engine/xmlform/triggers/triggers_Edit.xml index 9ba854e2b..33f296b36 100755 --- a/workflow/engine/xmlform/triggers/triggers_Edit.xml +++ b/workflow/engine/xmlform/triggers/triggers_Edit.xml @@ -86,16 +86,38 @@ window.onbeforeunload=function(){ } }; -function triggerSave1(form){ - ajax_post(form.action, form, 'POST'); - if(opener) { - if(@QSTEP_UID!="" && @QST_TYPE!="" && opener.showTriggers) - opener.showTriggers(@QSTEP_UID,@QST_TYPE); - if(opener.reloadTriggersShortList) - opener.reloadTriggersShortList(); - } - window.close(); +function triggerSave1(form) +{ + ajax_post( + form.action, + form, + "POST", + function (responseText) + { + var dataResponse = eval("(" + responseText + ")"); //json + + if (dataResponse.success) { + if (opener) { + if (@QSTEP_UID != "" && @QST_TYPE != "" && opener.showTriggers) { + opener.showTriggers(@QSTEP_UID, @QST_TYPE); + } + + if (opener.reloadTriggersShortList) { + opener.reloadTriggersShortList(); + } + } + + window.close(); + } else { + new leimnud.module.app.alert().make({ + label: dataResponse.msg + }); + } + }, + true + ); } - -]]> +]]> + + From 9130db35d2b4705268021ebba21932b3e6b3e09c Mon Sep 17 00:00:00 2001 From: jennylee Date: Thu, 20 Nov 2014 17:38:45 -0400 Subject: [PATCH 20/22] PM-968 2nd estructure en Nuevas instalacioens --- workflow/engine/controllers/installer.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/workflow/engine/controllers/installer.php b/workflow/engine/controllers/installer.php index 6ae340f59..f37fdd816 100755 --- a/workflow/engine/controllers/installer.php +++ b/workflow/engine/controllers/installer.php @@ -927,7 +927,25 @@ class Installer extends Controller return $info; } } + + //2nd STRUCTURE + $this->initPropel(true); + G::LoadClass("configuration"); + $conf = new Configurations(); + if (!$conf->exists("ENVIRONMENT_SETTINGS")) { + $conf->aConfig = array ("format" => '@userName (@firstName @lastName)', + "dateFormat" => 'd/m/Y', + "startCaseHideProcessInf" => false, + "casesListDateFormat" => 'Y-m-d H:i:s', + "casesListRowNumber" => 25, + "casesListRefreshTime" => 120 ); + $conf->saveConfig( 'ENVIRONMENT_SETTINGS', '' ); + } + $conf->setDirectoryStructureVer(2); + //$this->installLog( G::LoadTranslation('ID_INDEX_FILE_UPDATED', SYS_LANG, Array($indexFileUpdated, $sysConf['default_lang'],$sysConf['default_skin']))); + //CLI::logging(CLI::info("Version Directory Structure is 2 now.\n")); + $this->installLog( G::LoadTranslation('ID_INDEX_FILE_UPDATED', SYS_LANG, Array($indexFileUpdated, $sysConf['default_lang'],$sysConf['default_skin']))); $this->installLog( G::LoadTranslation('ID_INSTALL_SUCESS') ); From d6fedf2d2d4d3dca608f62e23666c66559e20620 Mon Sep 17 00:00:00 2001 From: norahmollo Date: Mon, 24 Nov 2014 11:06:28 -0400 Subject: [PATCH 21/22] PM-921 Installer for community distribution. Marker added in files with licensed features. --- gulliver/thirdparty/propel/Propel.php | 14 +++++++++----- workflow/engine/classes/class.licensedFeatures.php | 3 ++- workflow/engine/classes/class.wsBase.php | 10 +++++++++- workflow/engine/classes/class.wsTools.php | 2 ++ workflow/engine/menus/setup.php | 12 ++++++++++-- workflow/engine/methods/login/authentication.php | 3 ++- 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/gulliver/thirdparty/propel/Propel.php b/gulliver/thirdparty/propel/Propel.php index b6a7377c6..4cf122349 100755 --- a/gulliver/thirdparty/propel/Propel.php +++ b/gulliver/thirdparty/propel/Propel.php @@ -614,11 +614,15 @@ class Propel { */ public static function getDbConnection($name) { - $licensedFeatures = & PMLicensedFeatures::getSingleton(); - if (! $licensedFeatures->verifyfeature('02YeEFKNnVoOWFKMzN4ZmpXT0V3MU9SVklnOXNCcE9zcXJKa0tpemNmQkJ5OTUvOWlLdFhibGp0MHVHUlV0VmNpNw==')) { - return null; - } - + /*----------------------------------********---------------------------------*/ + $licensedFeatures = & PMLicensedFeatures::getSingleton(); + if (! $licensedFeatures->verifyfeature('02YeEFKNnVoOWFKMzN4ZmpXT0V3MU9SVklnOXNCcE9zcXJKa0tpemNmQkJ5OTUvOWlLdFhibGp0MHVHUlV0VmNpNw==')) { + /*----------------------------------********---------------------------------*/ + return null; + /*----------------------------------********---------------------------------*/ + } + /*----------------------------------********---------------------------------*/ + if (! empty(self::$configuration['datasources'][$name]['connection'])) { return self::getConnection($name); } diff --git a/workflow/engine/classes/class.licensedFeatures.php b/workflow/engine/classes/class.licensedFeatures.php index c7e1469e6..a7baf8d45 100644 --- a/workflow/engine/classes/class.licensedFeatures.php +++ b/workflow/engine/classes/class.licensedFeatures.php @@ -62,7 +62,7 @@ class PMLicensedFeatures } return self::$instancefeature; } - + /*----------------------------------********---------------------------------*/ public function verifyfeature ($featureName) { if (!class_exists("pmLicenseManager")) { @@ -82,5 +82,6 @@ class PMLicensedFeatures $this->featuresDetails[$value[0]]->enabled = $enable; return $enable; } + /*----------------------------------********---------------------------------*/ } diff --git a/workflow/engine/classes/class.wsBase.php b/workflow/engine/classes/class.wsBase.php index 43965394e..76be0ade5 100755 --- a/workflow/engine/classes/class.wsBase.php +++ b/workflow/engine/classes/class.wsBase.php @@ -921,7 +921,15 @@ class wsBase G::LoadClass('system'); } $licensedFeatures = & PMLicensedFeatures::getSingleton(); - $aSetup = (!empty($config) && $licensedFeatures->verifyfeature('nKaNTNuT1MzK0RsMEtXTnYzR09ucHF2WGNuS0hRdDBBak42WXJhNVVOOG1INEVoaU1EaTllbjBBeEJNeG9wRVJ6NmxQelhyVTBvdThzPQ==') ) ? $config : System::getEmailConfiguration(); + /*----------------------------------********---------------------------------*/ + if (!empty($config) && $licensedFeatures->verifyfeature('nKaNTNuT1MzK0RsMEtXTnYzR09ucHF2WGNuS0hRdDBBak42WXJhNVVOOG1INEVoaU1EaTllbjBBeEJNeG9wRVJ6NmxQelhyVTBvdThzPQ==')) { + $aSetup = $config; + } else { + /*----------------------------------********---------------------------------*/ + $aSetup = System::getEmailConfiguration(); + /*----------------------------------********---------------------------------*/ + } + /*----------------------------------********---------------------------------*/ $oSpool = new spoolRun(); diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index 0324f447a..8b715140c 100755 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -1717,11 +1717,13 @@ class workspaceTools $this->initPropel( true ); G::LoadClass("enterprise"); $licensedFeatures = & PMLicensedFeatures::getSingleton(); + /*----------------------------------********---------------------------------*/ if ($licensedFeatures->verifyfeature('95OY24wcXpEMzIyRmlNSnF0STNFSHJzMG9wYTJKekpLNmY2ZmRCeGtuZk5oUDloaUNhUGVjTDJBPT0=')) { enterpriseClass::setHashPassword($response); } else { return false; } + /*----------------------------------********---------------------------------*/ return true; } diff --git a/workflow/engine/menus/setup.php b/workflow/engine/menus/setup.php index 1b8c48b4e..a4615f9c3 100755 --- a/workflow/engine/menus/setup.php +++ b/workflow/engine/menus/setup.php @@ -26,9 +26,11 @@ global $G_TMP_MENU; global $RBAC; $partnerFlag = (defined('PARTNER_FLAG')) ? PARTNER_FLAG : false; +/*----------------------------------********---------------------------------*/ $oServerConf = & serverConf::getSingleton(); $sAudit = $oServerConf->getAuditLogProperty( 'AL_OPTION', SYS_SYS ); $licensedFeatures = & PMLicensedFeatures::getSingleton(); +/*----------------------------------********---------------------------------*/ if ($RBAC->userCanAccess('PM_SETUP') == 1 ) { //settings options @@ -99,20 +101,24 @@ if ($RBAC->userCanAccess('PM_SETUP') == 1) { $G_TMP_MENU->AddIdRawOption('LOG_CASE_SCHEDULER', '../cases/cases_Scheduler_Log', G::LoadTranslation('ID_CASE_SCHEDULER'), "icon-logs-list.png",'', 'logs'); $G_TMP_MENU->AddIdRawOption("CRON", "../setup/cron", G::LoadTranslation("ID_CRON_ACTIONS"), null, null, "logs"); $G_TMP_MENU->AddIdRawOption('EMAILS', '../mails/emailList', ucfirst (strtolower ( G::LoadTranslation('ID_EMAILS'))), '', '', 'logs'); + /*----------------------------------********---------------------------------*/ if (isset($sAudit) && $sAudit != false && $licensedFeatures->verifyfeature('vtSeHNhT0JnSmo1bTluUVlTYUxUbUFSVStEeXVqc1pEUG5EeXc0MGd2Q3ErYz0=')) { $G_TMP_MENU->AddIdRawOption('AUDIT_LOG', '../setup/auditLog', ucfirst (G::LoadTranslation('ID_AUDITLOG_DISPLAY')), '', '', 'logs'); } + /*----------------------------------********---------------------------------*/ } if ($RBAC->userCanAccess("PM_SETUP") == 1) { $G_TMP_MENU->AddIdRawOption("PM_REQUIREMENTS", "../setup/systemInfo", G::LoadTranslation("ID_PROCESSMAKER_REQUIREMENTS_CHECK"), "", "", "settings"); $G_TMP_MENU->AddIdRawOption("PHP_INFO", "../setup/systemInfo?option=php", G::LoadTranslation("ID_PHP_INFO"), "", "", "settings"); //$G_TMP_MENU->AddIdRawOption("PHP_MAINTENANCE", "../admin/maintenance", 'Maintenance', "", "", "settings"); + /*----------------------------------********---------------------------------*/ if ($licensedFeatures->verifyfeature('vtSeHNhT0JnSmo1bTluUVlTYUxUbUFSVStEeXVqc1pEUG5EeXc0MGd2Q3ErYz0=')) { $G_TMP_MENU->AddIdRawOption("AUDIT_LOG", "auditLogConfig", G::LoadTranslation("ID_AUDITLOG_DISPLAY"), "", "", "settings"); } + /*----------------------------------********---------------------------------*/ } - +/*----------------------------------********---------------------------------*/ require_once 'classes/class.pmLicenseManager.php'; if (!file_exists(PATH_DATA_SITE . "plugin.singleton")) { require_once PATH_CORE . 'methods' . PATH_SEP . 'enterprise' . PATH_SEP . 'enterprise.php'; @@ -137,9 +143,11 @@ if ((isset($pmLicenseManagerO->plan)) && ($pmLicenseManagerO->plan != "")) { if ($licenseStatusInfo["message"] != "") { $licStatusMsg = " (" . $licenseStatusInfo["message"] . ")"; } - +/*----------------------------------********---------------------------------*/ if ($RBAC->userCanAccess("PM_SETUP") == 1) { + /*----------------------------------********---------------------------------*/ $G_TMP_MENU->AddIdRawOption("PMENTERPRISE", "../enterprise/addonsStore", G::LoadTranslation('ID_MENU_NAME') . $licStatusMsg, "", "", "plugins"); + /*----------------------------------********---------------------------------*/ $G_TMP_MENU->AddIdRawOption("CASES_LIST_SETUP", "../cases/casesListSetup", G::LoadTranslation('ID_CASES_LIST'), "", "", "settings"); } diff --git a/workflow/engine/methods/login/authentication.php b/workflow/engine/methods/login/authentication.php index 6c0d191eb..018e1cd56 100755 --- a/workflow/engine/methods/login/authentication.php +++ b/workflow/engine/methods/login/authentication.php @@ -39,7 +39,7 @@ try { $usr = mb_strtolower(trim($frm['USR_USERNAME']), 'UTF-8'); $pwd = trim($frm['USR_PASSWORD']); } - + /*----------------------------------********---------------------------------*/ require_once PATH_CORE . 'methods' . PATH_SEP . 'enterprise' . PATH_SEP . 'enterprise.php'; if (!file_exists(PATH_DATA_SITE . "plugin.singleton")) { @@ -47,6 +47,7 @@ try { $enterprise->enable(); $enterprise->setup(); } + /*----------------------------------********---------------------------------*/ $uid = $RBAC->VerifyLogin($usr , $pwd); $RBAC->cleanSessionFiles(72); //cleaning session files older than 72 hours From 464e326c613c6bbfee5e520de77562075559ee08 Mon Sep 17 00:00:00 2001 From: Julio Cesar Laura Date: Mon, 24 Nov 2014 17:19:24 -0400 Subject: [PATCH 22/22] PM-961 Problemas al ejecutar el Cron para generar los casos para el Plugin Ftp Monitor SOLVED --- rbac/engine/classes/model/RbacUsers.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rbac/engine/classes/model/RbacUsers.php b/rbac/engine/classes/model/RbacUsers.php index 8861e4f6f..2cfa1b523 100755 --- a/rbac/engine/classes/model/RbacUsers.php +++ b/rbac/engine/classes/model/RbacUsers.php @@ -29,6 +29,10 @@ */ require_once 'classes/model/om/BaseRbacUsers.php'; +if (!class_exists('PMLicensedFeatures')) { + G::LoadClass('licensedFeatures'); +} + /** * Skeleton subclass for representing a row from the 'USERS' table. *