diff --git a/gulliver/js/ext/min/ext-all.js b/gulliver/js/ext/min/ext-all.js
index 5ef5532a2..157fc1e90 100644
--- a/gulliver/js/ext/min/ext-all.js
+++ b/gulliver/js/ext/min/ext-all.js
@@ -69,8 +69,8 @@ function getBrowserTimeZoneOffset()
{return-1*((new Date()).getTimezoneOffset()*60);}
function setExtStateManagerSetProvider(cache,additionalPrefix){var workspace='ws-undefined';var pathname=location.pathname.split('/');var cookieProvider=new Ext.state.CookieProvider();var i;if(additionalPrefix===undefined){additionalPrefix='';}
if(pathname.length>1){workspace=pathname[1].replace('sys','');}
-workspace=workspace+additionalPrefix;cookieProvider.on('statechange',function(provider,key,value){if(value!==null&&JSON.stringify(Ext.state.Manager.get(workspace+cache))!==JSON.stringify(value)){Ext.state.Manager.set(workspace+cache,value);}});Ext.state.Manager.setProvider(cookieProvider);Ext.state.Manager.clear(cache);try{if(window.extJsViewState!==undefined){for(i in extJsViewState){Ext.state.Manager.clear(i);}
-Ext.state.Manager.set(cache,Ext.state.Manager.getProvider().decodeValue(extJsViewState[workspace+cache]));}}catch(e){}}
+workspace=workspace+additionalPrefix;cookieProvider.on('statechange',function(provider,key,value){if(value!==null&&JSON.stringify(Ext.state.Manager.get(workspace+window.userUid+cache))!==JSON.stringify(value)){Ext.state.Manager.set(workspace+window.userUid+cache,value);}});Ext.state.Manager.setProvider(cookieProvider);Ext.state.Manager.clear(cache);try{if(window.extJsViewState!==undefined){for(i in extJsViewState){Ext.state.Manager.clear(i);}
+Ext.state.Manager.set(cache,Ext.state.Manager.getProvider().decodeValue(extJsViewState[workspace+window.userUid+cache]));}}catch(e){}}
function downloadFile(method,url,headers,formData,callBack){var xhr,win=window,value='blob',loadingFile=new Ext.LoadMask(Ext.getBody(),{msg:_('ID_LOADING')});method=method||'POST';loadingFile.show();if(win.XMLHttpRequest){xhr=new XMLHttpRequest();}else if(win.ActiveXObject){xhr=new ActiveXObject('Microsoft.XMLHTTP');}
win.URL=win.URL||win.webkitURL;xhr.open(method,url,true);xhr.responseType=value;Object.keys(headers).forEach(function(key){xhr.setRequestHeader(key,headers[key]);});xhr.onload=function(e){loadingFile.hide();if(xhr.status===200){if(xhr.getResponseHeader("Content-Disposition")!==null){var fileName=xhr.getResponseHeader("Content-Disposition").match(/\sfilename="([^"]+)"(\s|$)/)[1];var blob=xhr.response;if((navigator.userAgent.indexOf("MSIE")!==-1)||(navigator.userAgent.indexOf("Trident")!==-1)||(navigator.userAgent.indexOf("Edge")!==-1)){win.navigator.msSaveBlob(blob,fileName);}else{var doc=win.document,a=doc.createElementNS('http://www.w3.org/1999/xhtml','a'),event=doc.createEvent('MouseEvents');event.initMouseEvent('click',true,false,win,0,0,0,0,0,false,false,false,false,0,null);a.href=win.URL.createObjectURL(blob);a.download=fileName;a.dispatchEvent(event);}
if(typeof(callBack)!=='undefined'){callBack(xhr);}}else{PMExt.error(_('ID_ERROR'),_('ID_UNEXPECTED_ERROR_OCCURRED_PLEASE'));}}else{PMExt.error(_('ID_ERROR'),xhr.statusText);}};xhr.send(formData);}
diff --git a/gulliver/js/ext/pmos-common.js b/gulliver/js/ext/pmos-common.js
index 8a774e61d..d75b8b77c 100644
--- a/gulliver/js/ext/pmos-common.js
+++ b/gulliver/js/ext/pmos-common.js
@@ -609,8 +609,8 @@ function setExtStateManagerSetProvider(cache, additionalPrefix) {
}
workspace = workspace + additionalPrefix;
cookieProvider.on('statechange', function (provider, key, value) {
- if (value !== null && JSON.stringify(Ext.state.Manager.get(workspace + cache)) !== JSON.stringify(value)) {
- Ext.state.Manager.set(workspace + cache, value);
+ if (value !== null && JSON.stringify(Ext.state.Manager.get(workspace + window.userUid + cache)) !== JSON.stringify(value)) {
+ Ext.state.Manager.set(workspace + window.userUid + cache, value);
}
});
Ext.state.Manager.setProvider(cookieProvider);
@@ -620,7 +620,7 @@ function setExtStateManagerSetProvider(cache, additionalPrefix) {
for (i in extJsViewState) {
Ext.state.Manager.clear(i);
}
- Ext.state.Manager.set(cache, Ext.state.Manager.getProvider().decodeValue(extJsViewState[workspace + cache]));
+ Ext.state.Manager.set(cache, Ext.state.Manager.getProvider().decodeValue(extJsViewState[workspace + window.userUid + cache]));
}
} catch (e) {
}
diff --git a/gulliver/system/class.form.php b/gulliver/system/class.form.php
index 9814d8e5f..96cfb7cbb 100644
--- a/gulliver/system/class.form.php
+++ b/gulliver/system/class.form.php
@@ -105,6 +105,10 @@ class Form extends XmlForm
$filename = $filename . '.xml';
}
$this->home = $home;
+
+ //to do: This must be removed, the post validation should only be done for the classic version.
+ self::createXMLFileIfNotExists($this->home . $filename);
+
$res = parent::parseFile( $filename, $language, $forceParse );
if ($res == 1) {
trigger_error( 'Faild to parse file ' . $filename . '.', E_USER_ERROR );
@@ -751,5 +755,53 @@ class Form extends XmlForm
}
return $data;
}
+
+ /**
+ * Create XML file if not exists.
+ *
+ * @param string $filepath
+ *
+ * @see Form->__construct()
+ * @@link https://wiki.processmaker.com/3.1/Cases
+ * @link https://wiki.processmaker.com/index.php/2.5.X/DynaForms#XML_tab
+ */
+ public static function createXMLFileIfNotExists($filepath)
+ {
+ if (file_exists($filepath)) {
+ return;
+ }
+ $pathParts = pathinfo($filepath);
+ if (empty($pathParts)) {
+ return;
+ }
+ $dynUid = $pathParts["filename"];
+ $proUid = basename($pathParts["dirname"]);
+ $pathHome = dirname($pathParts["dirname"]) . PATH_SEP;
+ self::createXMLFile($proUid, $dynUid, 'xmlform', $pathHome);
+ }
+
+ /**
+ * Create XML file.
+ *
+ * @param string $proUid
+ * @param string $dynUid
+ * @param string $dynType
+ * @param string $pathHome
+ *
+ * @see Dynaform->create()
+ * @see Form::createXMLFileIfNotExists()
+ * @link https://wiki.processmaker.com/3.1/Cases
+ * @link https://wiki.processmaker.com/index.php/2.5.X/DynaForms#XML_tab
+ */
+ public static function createXMLFile($proUid, $dynUid, $dynType = 'xmlform', $pathHome = PATH_XMLFORM)
+ {
+ $xml = '' . "\n";
+ $xml .= '' . "\n";
+ $xml .= '';
+ G::verifyPath($pathHome . $proUid, true);
+ $file = fopen($pathHome . $proUid . '/' . $dynUid . '.xml', 'w');
+ fwrite($file, $xml);
+ fclose($file);
+ }
}
diff --git a/gulliver/system/class.headPublisher.php b/gulliver/system/class.headPublisher.php
index 8204a05e0..b153f05a7 100644
--- a/gulliver/system/class.headPublisher.php
+++ b/gulliver/system/class.headPublisher.php
@@ -746,11 +746,11 @@ class headPublisher
*
* @return array $views
*/
- public function getExtJsViewState()
+ public function getExtJsViewState($userUid = '')
{
$json = new stdClass();
$views = array();
- $keyState = "extJsViewState";
+ $keyState = "extJsViewState" . $userUid;
$prefixExtJs = "ys-";
$oServerConf = ServerConf::getSingleton();
$deleteCache = true;
diff --git a/workflow/engine/classes/Cases.php b/workflow/engine/classes/Cases.php
index 5871fefee..deba3d144 100644
--- a/workflow/engine/classes/Cases.php
+++ b/workflow/engine/classes/Cases.php
@@ -468,44 +468,44 @@ class Cases
{
try {
$oApp = new Application;
- $aFields = $oApp->Load($sAppUid);
+ $fields = $oApp->Load($sAppUid);
- $appData = self::unserializeData($aFields['APP_DATA']);
+ $appData = self::unserializeData($fields['APP_DATA']);
- $aFields['APP_DATA'] = G::array_merges(G::getSystemConstants(), $appData);
+ $fields['APP_DATA'] = G::array_merges(G::getSystemConstants(), $appData);
switch ($oApp->getAppStatus()) {
case 'COMPLETED':
- $aFields['STATUS'] = G::LoadTranslation('ID_COMPLETED');
+ $fields['STATUS'] = G::LoadTranslation('ID_COMPLETED');
break;
case 'CANCELLED':
- $aFields['STATUS'] = G::LoadTranslation('ID_CANCELLED');
+ $fields['STATUS'] = G::LoadTranslation('ID_CANCELLED');
break;
case 'PAUSED':
- $aFields['STATUS'] = G::LoadTranslation('ID_PAUSED');
+ $fields['STATUS'] = G::LoadTranslation('ID_PAUSED');
break;
case 'DRAFT':
- $aFields['STATUS'] = G::LoadTranslation('ID_DRAFT');
+ $fields['STATUS'] = G::LoadTranslation('ID_DRAFT');
break;
case 'TO_DO':
- $aFields['STATUS'] = G::LoadTranslation('ID_TO_DO');
+ $fields['STATUS'] = G::LoadTranslation('ID_TO_DO');
break;
}
$oUser = new Users();
try {
$oUser->load($oApp->getAppInitUser());
$uFields = $oUser->toArray(BasePeer::TYPE_FIELDNAME);
- $aFields['TITLE'] = $aFields['APP_TITLE'];
- $aFields['DESCRIPTION'] = $aFields['APP_DESCRIPTION'];
- $aFields['CREATOR'] = $oUser->getUsrFirstname() . ' ' . $oUser->getUsrLastname();
- $aFields['CREATE_DATE'] = $oApp->getAppCreateDate();
- $aFields['UPDATE_DATE'] = $oApp->getAppUpdateDate();
+ $fields['TITLE'] = $fields['APP_TITLE'];
+ $fields['DESCRIPTION'] = $fields['APP_DESCRIPTION'];
+ $fields['CREATOR'] = $oUser->getUsrFirstname() . ' ' . $oUser->getUsrLastname();
+ $fields['CREATE_DATE'] = $oApp->getAppCreateDate();
+ $fields['UPDATE_DATE'] = $oApp->getAppUpdateDate();
} catch (Exception $oError) {
- $aFields['TITLE'] = $oApp->getAppTitle();
- $aFields['DESCRIPTION'] = '';
- $aFields['CREATOR'] = '(USER_DELETED)';
- $aFields['CREATE_DATE'] = $oApp->getAppCreateDate();
- $aFields['UPDATE_DATE'] = $oApp->getAppUpdateDate();
+ $fields['TITLE'] = $oApp->getAppTitle();
+ $fields['DESCRIPTION'] = '';
+ $fields['CREATOR'] = '(USER_DELETED)';
+ $fields['CREATE_DATE'] = $oApp->getAppCreateDate();
+ $fields['UPDATE_DATE'] = $oApp->getAppUpdateDate();
}
if ($iDelIndex > 0) {
@@ -513,50 +513,52 @@ class Cases
$oAppDel = new AppDelegation();
$oAppDel->Load($sAppUid, $iDelIndex);
$aAppDel = $oAppDel->toArray(BasePeer::TYPE_FIELDNAME);
- $aFields['TAS_UID'] = $aAppDel['TAS_UID'];
- $aFields['DEL_INDEX'] = $aAppDel['DEL_INDEX'];
- $aFields['DEL_PREVIOUS'] = $aAppDel['DEL_PREVIOUS'];
- $aFields['DEL_TYPE'] = $aAppDel['DEL_TYPE'];
- $aFields['DEL_PRIORITY'] = $aAppDel['DEL_PRIORITY'];
- $aFields['DEL_THREAD_STATUS'] = $aAppDel['DEL_THREAD_STATUS'];
- $aFields['DEL_THREAD'] = $aAppDel['DEL_THREAD'];
- $aFields['DEL_DELEGATE_DATE'] = $aAppDel['DEL_DELEGATE_DATE'];
- $aFields['DEL_INIT_DATE'] = $aAppDel['DEL_INIT_DATE'];
- $aFields['DEL_TASK_DUE_DATE'] = $aAppDel['DEL_TASK_DUE_DATE'];
- $aFields['DEL_FINISH_DATE'] = $aAppDel['DEL_FINISH_DATE'];
- $aFields['CURRENT_USER_UID'] = $aAppDel['USR_UID'];
+ $fields['TAS_UID'] = $aAppDel['TAS_UID'];
+ $fields['DEL_INDEX'] = $aAppDel['DEL_INDEX'];
+ $fields['DEL_PREVIOUS'] = $aAppDel['DEL_PREVIOUS'];
+ $fields['DEL_TYPE'] = $aAppDel['DEL_TYPE'];
+ $fields['DEL_PRIORITY'] = $aAppDel['DEL_PRIORITY'];
+ $fields['DEL_THREAD_STATUS'] = $aAppDel['DEL_THREAD_STATUS'];
+ $fields['DEL_THREAD'] = $aAppDel['DEL_THREAD'];
+ $fields['DEL_DELEGATE_DATE'] = $aAppDel['DEL_DELEGATE_DATE'];
+ $fields['DEL_INIT_DATE'] = $aAppDel['DEL_INIT_DATE'];
+ $fields['DEL_TASK_DUE_DATE'] = $aAppDel['DEL_TASK_DUE_DATE'];
+ $fields['DEL_FINISH_DATE'] = $aAppDel['DEL_FINISH_DATE'];
+ $fields['CURRENT_USER_UID'] = $aAppDel['USR_UID'];
//Update the global variables
- $aFields['TASK'] = $aAppDel['TAS_UID'];
- $aFields['INDEX'] = $aAppDel['DEL_INDEX'];
- $aFields['TAS_ID'] = $aAppDel['TAS_ID'];
- $aFields['PRO_ID'] = $aAppDel['PRO_ID'];
+ $fields['TASK'] = $aAppDel['TAS_UID'];
+ $fields['INDEX'] = $aAppDel['DEL_INDEX'];
+ $fields['TAS_ID'] = $aAppDel['TAS_ID'];
+ $fields['PRO_ID'] = $aAppDel['PRO_ID'];
try {
$oCurUser = new Users();
if ($jump != '') {
- $aCases = $oAppDel->LoadParallel($sAppUid);
- $aFields['TAS_UID'] = '';
- $aFields['CURRENT_USER'] = array();
- foreach ($aCases as $key => $value) {
- $oCurUser->load($value['USR_UID']);
- $aFields['CURRENT_USER'][] = $oCurUser->getUsrFirstname() . ' ' . $oCurUser->getUsrLastname();
- $aFields['TAS_UID'] .= (($aFields['TAS_UID'] != '') ? '|' : '') . $value['TAS_UID'];
+ $cases = $oAppDel->LoadParallel($sAppUid);
+ if (!empty($cases)) {
+ $fields['TAS_UID'] = '';
}
- $aFields['CURRENT_USER'] = implode(" - ", array_values($aFields['CURRENT_USER']));
- $tasksArray = array_filter(explode('|', $aFields['TAS_UID']));
+ $fields['CURRENT_USER'] = array();
+ foreach ($cases as $key => $value) {
+ $oCurUser->load($value['USR_UID']);
+ $fields['CURRENT_USER'][] = $oCurUser->getUsrFirstname() . ' ' . $oCurUser->getUsrLastname();
+ $fields['TAS_UID'] .= (($fields['TAS_UID'] != '') ? '|' : '') . $value['TAS_UID'];
+ }
+ $fields['CURRENT_USER'] = implode(" - ", array_values($fields['CURRENT_USER']));
+ $tasksArray = array_filter(explode('|', $fields['TAS_UID']));
if (count($tasksArray) == 1) {
- $aFields['TAS_UID'] = $tasksArray[0];
+ $fields['TAS_UID'] = $tasksArray[0];
}
} else {
$oCurUser->load($aAppDel['USR_UID']);
- $aFields['CURRENT_USER'] = $oCurUser->getUsrFirstname() . ' ' . $oCurUser->getUsrLastname();
+ $fields['CURRENT_USER'] = $oCurUser->getUsrFirstname() . ' ' . $oCurUser->getUsrLastname();
}
} catch (Exception $oError) {
- $aFields['CURRENT_USER'] = '';
+ $fields['CURRENT_USER'] = '';
}
}
- return $aFields;
+ return $fields;
} catch (exception $e) {
throw ($e);
}
@@ -3534,6 +3536,8 @@ class Cases
/**
* This section of code its related to the route the case with parallel task in the same time
* @link https://processmaker.atlassian.net/browse/PMC-2
+ *
+ * @todo: The solution for ticket HOR-4602 should be restated in another ticket, for now this change was reverted
*/
if ($oPMScript->executedOn() === $oPMScript::AFTER_ROUTING) {
//Get the variables changed with the trigger
@@ -3542,11 +3546,6 @@ class Cases
//We will be load the last appData because:
//Other thread execution can be changed the variables
$appUid = !empty($fieldsCase['APPLICATION']) ? $fieldsCase['APPLICATION'] : '';
- if (!empty($appUid)) {
- $lastFieldsCase = $this->loadCase($appUid)['APP_DATA'];
- //Update $fieldsCase with the last appData
- $fieldsCase = array_merge($fieldsCase, $lastFieldsCase);
- }
//Save the fields changed in the trigger
if (!$varInAfterRouting && !empty($fieldsTrigger)) {
@@ -5712,7 +5711,7 @@ class Cases
'',
'',
'pending',
- '',
+ 1,
$dataLastEmail['msgError'],
true,
isset($arrayData['APP_NUMBER']) ? $arrayData['APP_NUMBER'] : 0,
diff --git a/workflow/engine/classes/Processes.php b/workflow/engine/classes/Processes.php
index a5b53da32..43cdc8ce9 100644
--- a/workflow/engine/classes/Processes.php
+++ b/workflow/engine/classes/Processes.php
@@ -2190,7 +2190,7 @@ class Processes
$labels = ['OUT_DOC_TITLE' => $row['OUT_DOC_TITLE'],
'OUT_DOC_DESCRIPTION' => !empty($row['OUT_DOC_DESCRIPTION']) ? $row['OUT_DOC_DESCRIPTION'] : '',
'OUT_DOC_FILENAME' => $row['OUT_DOC_FILENAME'],
- 'OUT_DOC_TEMPLATE' => $row['OUT_DOC_TEMPLATE']];
+ 'OUT_DOC_TEMPLATE' => !empty($row['OUT_DOC_TEMPLATE']) ? $row['OUT_DOC_TEMPLATE'] : ''];
$this->insertToContentTable($con, $labels, $row['OUT_DOC_UID'], SYS_LANG);
}
$con->commit();
diff --git a/workflow/engine/classes/model/AppMessage.php b/workflow/engine/classes/model/AppMessage.php
index 90f1fc9a4..8758937b3 100644
--- a/workflow/engine/classes/model/AppMessage.php
+++ b/workflow/engine/classes/model/AppMessage.php
@@ -160,7 +160,7 @@ class AppMessage extends BaseAppMessage
* @param string $appMsgTemplate,
* @param string $appMsgAttach,
* @param string $appMsgStatus,
- * @param string $appMsgShowMsg,
+ * @param integer $appMsgShowMsg,
* @param string $appMsgError,
* @param boolean $contentTypeIsHtml
* @param integer $appNumber,
@@ -183,7 +183,7 @@ class AppMessage extends BaseAppMessage
$appMsgTemplate = '',
$appMsgAttach = '',
$appMsgStatus = 'pending',
- $appMsgShowMsg = '',
+ $appMsgShowMsg = 1,
$appMsgError = '',
$contentTypeIsHtml = true,
$appNumber = 0,
diff --git a/workflow/engine/classes/model/AppNotes.php b/workflow/engine/classes/model/AppNotes.php
index 3885aa6ad..a36b13681 100644
--- a/workflow/engine/classes/model/AppNotes.php
+++ b/workflow/engine/classes/model/AppNotes.php
@@ -238,7 +238,7 @@ class AppNotes extends BaseAppNotes
'',
'',
'pending',
- '',
+ 1,
$msgError,
true,
(isset($fieldCase['APP_NUMBER'])) ? $fieldCase['APP_NUMBER'] : 0,
diff --git a/workflow/engine/classes/model/Dynaform.php b/workflow/engine/classes/model/Dynaform.php
index f1053c0ac..89979a570 100644
--- a/workflow/engine/classes/model/Dynaform.php
+++ b/workflow/engine/classes/model/Dynaform.php
@@ -223,14 +223,8 @@ class Dynaform extends BaseDynaform
$description = "Create from a PM Table: " . $addTabName . ", ";
}
G::auditLog("CreateDynaform", $description . "Dynaform Title: " . $aData['DYN_TITLE'] . ", Type: " . $aData['DYN_TYPE'] . ", Description: " . $aData['DYN_DESCRIPTION'] . ", Mode: " . $mode);
-
- $sXml = '' . "\n";
- $sXml .= '' . "\n";
- $sXml .= '';
- G::verifyPath(PATH_DYNAFORM . $this->getProUid(), true);
- $oFile = fopen(PATH_DYNAFORM . $this->getProUid() . '/' . $this->getDynUid() . '.xml', 'w');
- fwrite($oFile, $sXml);
- fclose($oFile);
+
+ Form::createXMLFile($this->getProUid(), $this->getDynUid(), $this->getDynType(), PATH_DYNAFORM);
return $this->getDynUid();
} else {
$msg = '';
diff --git a/workflow/engine/methods/cases/ajaxListener.php b/workflow/engine/methods/cases/ajaxListener.php
index 183764b50..6b64382cf 100644
--- a/workflow/engine/methods/cases/ajaxListener.php
+++ b/workflow/engine/methods/cases/ajaxListener.php
@@ -394,6 +394,12 @@ class Ajax
print(G::json_encode($processData));
}
+ /**
+ * Get the task information of the current task
+ *
+ * @see workflow/engine/templates/cases/open->taskInformation()
+ * @link https://wiki.processmaker.com/3.3/Cases/Information#Task_Information
+ */
public function getTaskInformation()
{
if (!isset($_SESSION['USER_LOGGED'])) {
@@ -408,7 +414,15 @@ class Ajax
if ($_SESSION['TASK'] == '-1') {
$_SESSION['TASK'] = $_SESSION['CURRENT_TASK'];
}
- $taskData = $task->getDelegatedTaskData($_SESSION['TASK'], $_SESSION['APPLICATION'], $_SESSION['INDEX']);
+
+ $arrayTaskUid = explode('|', $_SESSION['TASK']);
+
+ if (count($arrayTaskUid) > 1) {
+ $arrayTaskUid = array_unique($arrayTaskUid);
+ }
+ $taskUid = $arrayTaskUid[0];
+
+ $taskData = $task->getDelegatedTaskData($taskUid, $_SESSION['APPLICATION'], $_SESSION['INDEX']);
$taskData = \ProcessMaker\Util\DateTime::convertUtcToTimeZone($taskData);
diff --git a/workflow/engine/methods/cases/caseMessageHistory_Ajax.php b/workflow/engine/methods/cases/caseMessageHistory_Ajax.php
index 6e4c60fee..8f86eb4f6 100644
--- a/workflow/engine/methods/cases/caseMessageHistory_Ajax.php
+++ b/workflow/engine/methods/cases/caseMessageHistory_Ajax.php
@@ -1,6 +1,7 @@
xssFilterHard($_POST);
@@ -85,6 +86,7 @@ switch ($actionAjax) {
if ($respMess == 'BLOCK' || $respMess == '') {
$appMessageArray[$index]['APP_MSG_BODY'] = '';
}
+ $appMessageArray[$index]['APP_MSG_DATE'] = DateTime::convertUtcToTimeZone($appMessageArray[$index]['APP_MSG_DATE']);
$messageList[] = array_merge($appMessageArray[$index], ['MSGS_HISTORY' => $respMess]);
}
}
diff --git a/workflow/engine/methods/cases/casesListExtJs.php b/workflow/engine/methods/cases/casesListExtJs.php
index 559698ee7..30adfce14 100644
--- a/workflow/engine/methods/cases/casesListExtJs.php
+++ b/workflow/engine/methods/cases/casesListExtJs.php
@@ -196,7 +196,8 @@ $oHeadPublisher->addExtJsScript('app/main', true);
$oHeadPublisher->addExtJsScript('cases/casesList', false); //adding a javascript file .js
$oHeadPublisher->addContent('cases/casesListExtJs'); //adding a html file .html.
$oHeadPublisher->assign('FORMATS', $c->getFormats());
-$oHeadPublisher->assign('extJsViewState', $oHeadPublisher->getExtJsViewState());
+$oHeadPublisher->assign('userUid', $userUid);
+$oHeadPublisher->assign('extJsViewState', $oHeadPublisher->getExtJsViewState($userUid));
$oHeadPublisher->assign('isIE', Bootstrap::isIE());
$oHeadPublisher->assign('__OPEN_APPLICATION_UID__', $openApplicationUid);
diff --git a/workflow/engine/methods/cases/cases_Ajax.php b/workflow/engine/methods/cases/cases_Ajax.php
index 823fa5734..399ab523b 100644
--- a/workflow/engine/methods/cases/cases_Ajax.php
+++ b/workflow/engine/methods/cases/cases_Ajax.php
@@ -1,6 +1,7 @@
xssFilterHard($_GET);
@@ -581,6 +582,7 @@ switch (($_POST['action']) ? $_POST['action'] : $_REQUEST['action']) {
while ($rs->next()) {
$result = $rs->getRow();
$result["TYPE"] = (array_key_exists($result["TYPE"], $arrayToTranslation)) ? $arrayToTranslation[$result["TYPE"]] : $result["TYPE"];
+ $result['CREATE_DATE'] = DateTime::convertUtcToTimeZone($result['CREATE_DATE']);
$aProcesses[] = $result;
}
@@ -622,7 +624,7 @@ switch (($_POST['action']) ? $_POST['action'] : $_REQUEST['action']) {
$result["FILEDOCEXIST"] = ($result["FILEDOC"]);
$result["FILEPDFEXIST"] = ($result["FILEPDF"]);
$result["DELETE_FILE"] = (isset($result['ID_DELETE']) && $result['ID_DELETE'] == 'Delete') ? true : false;
-
+ $result['CREATE_DATE'] = DateTime::convertUtcToTimeZone($result['CREATE_DATE']);
$aProcesses[] = $result;
$rs->next();
diff --git a/workflow/engine/methods/cases/summary.php b/workflow/engine/methods/cases/summary.php
index 1a843ea22..e20b022ea 100644
--- a/workflow/engine/methods/cases/summary.php
+++ b/workflow/engine/methods/cases/summary.php
@@ -1,26 +1,6 @@
.
- *
- * For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
- * Coral Gables, FL, 33134, USA, or email info@colosa.com.
- */
+
+use ProcessMaker\Util\DateTime;
try {
global $RBAC;
@@ -70,7 +50,7 @@ try {
if ($result->next()) {
$FieldsPmDynaform = $applicationFields;
$FieldsPmDynaform["CURRENT_DYNAFORM"] = $_REQUEST['DYN_UID'];
- $a = new PmDynaform(\ProcessMaker\Util\DateTime::convertUtcToTimeZone($FieldsPmDynaform));
+ $a = new PmDynaform(DateTime::convertUtcToTimeZone($FieldsPmDynaform));
$a->printView();
}
if (file_exists( PATH_DYNAFORM . $applicationFields['PRO_UID'] . PATH_SEP . $_REQUEST['DYN_UID'] . '.xml' )) {
diff --git a/workflow/engine/methods/login/authentication.php b/workflow/engine/methods/login/authentication.php
index 5058e0950..1fb2c0864 100644
--- a/workflow/engine/methods/login/authentication.php
+++ b/workflow/engine/methods/login/authentication.php
@@ -1,5 +1,7 @@
loadOrCreateIfNotExists($_SESSION['USER_LOGGED'], array('USR_PASSWORD_HISTORY' => serialize(array(G::encryptOld($pwd)))));
+
+ //change password
+ if ($changePassword === true) {
+ $user = new User();
+ $currentUser = $user->changePassword($_SESSION['USER_LOGGED'], $_POST['form']['USR_PASSWORD']);
+ G::header('Location: ' . $currentUser["__REDIRECT_PATH__"]);
+ return;
+ }
+
//Get the errors in the password
$errorInPassword = $userProperty->validatePassword(
$_POST['form']['USR_PASSWORD'],
@@ -345,13 +368,23 @@ try {
$G_PUBLISH = new Publisher;
$version = explode('.', trim(file_get_contents(PATH_GULLIVER . 'VERSION')));
$version = isset($version[0]) ? intval($version[0]) : 0;
+
if ($version >= 3) {
- $G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/changePasswordpm3', '', $messPassword,
- 'changePassword');
+ $values = [
+ "usrUsername" => $usr,
+ "usrPassword" => $pwd,
+ "userEnvironment" => config("system.workspace"),
+ "browserTimeZoneOffset" => $_POST['form']['BROWSER_TIME_ZONE_OFFSET']
+ ];
+ $messPassword['__USR_PASSWORD_CHANGE__'] = G::generateUniqueID();
+ Cache::put($messPassword['__USR_PASSWORD_CHANGE__'], $values, 2);
+ $G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/changePasswordpm3', '', $messPassword, 'sysLoginVerify');
+ G::RenderPage('publish');
+ session_destroy();
} else {
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/changePassword', '', $messPassword, 'changePassword');
+ G::RenderPage('publish');
}
- G::RenderPage('publish');
die;
}
diff --git a/workflow/engine/methods/login/changePassword.php b/workflow/engine/methods/login/changePassword.php
index a17e2739d..43f55089b 100644
--- a/workflow/engine/methods/login/changePassword.php
+++ b/workflow/engine/methods/login/changePassword.php
@@ -1,92 +1,7 @@
load($_SESSION['USER_LOGGED']);
-global $RBAC;
-$aData['USR_UID'] = $aUser['USR_UID'];
-$aData['USR_USERNAME'] = $aUser['USR_USERNAME'];
-$aData['USR_PASSWORD'] = Bootstrap::hashPassword($_POST['form']['USR_PASSWORD']);
-$aData['USR_FIRSTNAME'] = $aUser['USR_FIRSTNAME'];
-$aData['USR_LASTNAME'] = $aUser['USR_LASTNAME'];
-$aData['USR_EMAIL'] = $aUser['USR_EMAIL'];
-$aData['USR_DUE_DATE'] = $aUser['USR_DUE_DATE'];
-$aData['USR_UPDATE_DATE'] = date('Y-m-d H:i:s');
-$RBAC->updateUser($aData, $aUser['USR_ROLE']);
-$aData['USR_COUNTRY'] = $aUser['USR_COUNTRY'];
-$aData['USR_CITY'] = $aUser['USR_CITY'];
-$aData['USR_LOCATION'] = $aUser['USR_LOCATION'];
-$aData['USR_ADDRESS'] = $aUser['USR_ADDRESS'];
-$aData['USR_PHONE'] = $aUser['USR_PHONE'];
-$aData['USR_ZIP_CODE'] = $aUser['USR_ZIP_CODE'];
-$aData['USR_POSITION'] = $aUser['USR_POSITION'];
-$oUser->update($aData);
-require_once 'classes/model/UsersProperties.php';
-$oUserProperty = new UsersProperties();
-$aUserProperty = $oUserProperty->load($_SESSION['USER_LOGGED']);
-$aHistory = unserialize($aUserProperty['USR_PASSWORD_HISTORY']);
-
-if (!is_array($aHistory)) {
- $aHistory = array();
-}
-
-if (!defined('PPP_PASSWORD_HISTORY')) {
- define('PPP_PASSWORD_HISTORY', 0);
-}
-
-if (PPP_PASSWORD_HISTORY > 0) {
- if (count($aHistory) >= PPP_PASSWORD_HISTORY) {
- array_shift($aHistory);
- }
- $aHistory[] = $_POST['form']['USR_PASSWORD'];
-}
-
-$aUserProperty['USR_LAST_UPDATE_DATE'] = date('Y-m-d H:i:s');
-$aUserProperty['USR_LOGGED_NEXT_TIME'] = 0;
-$aUserProperty['USR_PASSWORD_HISTORY'] = serialize($aHistory);
-$oUserProperty->update($aUserProperty);
-
-if (class_exists('redirectDetail')) {
- //falta validar...
- if (isset($RBAC->aUserInfo['PROCESSMAKER']['ROLE']['ROL_CODE'])) {
- $userRole = $RBAC->aUserInfo['PROCESSMAKER']['ROLE']['ROL_CODE'];
- }
- $oPluginRegistry = PluginRegistry::loadSingleton();
- //$oPluginRegistry->showArrays();
- $aRedirectLogin = $oPluginRegistry->getRedirectLogins();
- if (isset($aRedirectLogin)) {
- if (is_array($aRedirectLogin)) {
- /** @var \ProcessMaker\Plugins\Interfaces\RedirectDetail $detail */
- foreach ($aRedirectLogin as $detail) {
- if (isset($detail->sPathMethod)) {
- if ($detail->equalRoleCodeTo($userRole)) {
- G::header(
- 'location: /sys' . SYS_TEMP . '/' . SYS_LANG .
- '/' . SYS_SKIN . '/' . $detail->getPathMethod()
- );
- die;
- }
- }
- }
- }
- }
-}
-//end plugin
-
-if (isset($frm['USER_LANG'])) {
- if ($frm['USER_LANG'] != '') {
- $lang = $frm['USER_LANG'];
- }
-} else {
- if (defined('SYS_LANG')) {
- $lang = SYS_LANG;
- } else {
- $lang = 'en';
- }
-}
-$sLocation = $oUserProperty->redirectTo($_SESSION['USER_LOGGED'], $lang);
-G::header('Location: ' . $sLocation);
-die;
+use ProcessMaker\BusinessModel\User;
+$user = new User();
+$currentUser = $user->changePassword($_SESSION['USER_LOGGED'], $_POST['form']['USR_PASSWORD'], isset($_POST['form']['USER_LANG']) ? $_POST['form']['USER_LANG'] : "");
+G::header('Location: ' . $currentUser["__REDIRECT_PATH__"]);
diff --git a/workflow/engine/methods/mails/emailsAjax.php b/workflow/engine/methods/mails/emailsAjax.php
index 903c1275e..d83cf5d07 100644
--- a/workflow/engine/methods/mails/emailsAjax.php
+++ b/workflow/engine/methods/mails/emailsAjax.php
@@ -2,6 +2,7 @@
use ProcessMaker\Plugins\PluginRegistry;
use ProcessMaker\Exception\RBACException;
+use ProcessMaker\Util\DateTime;
$req = (isset($_REQUEST['request']) ? $_REQUEST['request'] : '');
@@ -131,6 +132,7 @@ switch ($req) {
while ($result->next()) {
$row = $result->getRow();
$row['APP_MSG_STATUS'] = ucfirst($row['APP_MSG_STATUS']);
+ $row['APP_MSG_DATE'] = DateTime::convertUtcToTimeZone($row['APP_MSG_DATE']);
switch ($filterBy) {
case 'CASES':
diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php b/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php
index d5d4f087b..bdd47c37d 100644
--- a/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php
+++ b/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php
@@ -411,7 +411,7 @@ class ActionsByEmail
'',
'',
'pending',
- '',
+ 1,
'',
false,
isset($dataRes['APP_NUMBER']) ? $dataRes['APP_NUMBER'] : 0,
diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/User.php b/workflow/engine/src/ProcessMaker/BusinessModel/User.php
index ddcaf367b..e5d18ee37 100644
--- a/workflow/engine/src/ProcessMaker/BusinessModel/User.php
+++ b/workflow/engine/src/ProcessMaker/BusinessModel/User.php
@@ -2005,4 +2005,111 @@ class User
return $isSupervisor;
}
}
+
+ /**
+ * It changes the password of the user specified by its identifier, optionally
+ * the value of $userLang can be sent, otherwise the system value is taken.
+ * In case of success, the updated user returns.
+ *
+ * @global object $RBAC
+ * @param string $usrUid
+ * @param string $usrPassword
+ * @param string $userLang
+ *
+ * @return string
+ *
+ * @see workflow/engine/methods/login/authentication.php
+ * @see workflow/engine/methods/login/changePassword.php
+ * @link https://wiki.processmaker.com/3.0/Managing_Users#Creating_New_Users
+ */
+ public function changePassword($usrUid, $usrPassword, $userLang = "")
+ {
+ global $RBAC;
+
+ $users = new Users();
+ $user = $users->load($usrUid);
+
+ $data = [];
+ $data['USR_UID'] = $user['USR_UID'];
+ $data['USR_USERNAME'] = $user['USR_USERNAME'];
+ $data['USR_PASSWORD'] = Bootstrap::hashPassword($usrPassword);
+ $data['USR_FIRSTNAME'] = $user['USR_FIRSTNAME'];
+ $data['USR_LASTNAME'] = $user['USR_LASTNAME'];
+ $data['USR_EMAIL'] = $user['USR_EMAIL'];
+ $data['USR_DUE_DATE'] = $user['USR_DUE_DATE'];
+ $data['USR_UPDATE_DATE'] = date('Y-m-d H:i:s');
+
+ $RBAC->updateUser($data, $user['USR_ROLE']);
+
+ $data['USR_COUNTRY'] = $user['USR_COUNTRY'];
+ $data['USR_CITY'] = $user['USR_CITY'];
+ $data['USR_LOCATION'] = $user['USR_LOCATION'];
+ $data['USR_ADDRESS'] = $user['USR_ADDRESS'];
+ $data['USR_PHONE'] = $user['USR_PHONE'];
+ $data['USR_ZIP_CODE'] = $user['USR_ZIP_CODE'];
+ $data['USR_POSITION'] = $user['USR_POSITION'];
+
+ $users->update($data);
+
+ $usersProperties = new UsersProperties();
+ $userProperty = $usersProperties->load($usrUid);
+ $history = unserialize($userProperty['USR_PASSWORD_HISTORY']);
+
+ if (!is_array($history)) {
+ $history = [];
+ }
+
+ if (!defined('PPP_PASSWORD_HISTORY')) {
+ define('PPP_PASSWORD_HISTORY', 0);
+ }
+
+ if (PPP_PASSWORD_HISTORY > 0) {
+ if (count($history) >= PPP_PASSWORD_HISTORY) {
+ array_shift($history);
+ }
+ $history[] = $usrPassword;
+ }
+
+ $userProperty['USR_LAST_UPDATE_DATE'] = date('Y-m-d H:i:s');
+ $userProperty['USR_LOGGED_NEXT_TIME'] = 0;
+ $userProperty['USR_PASSWORD_HISTORY'] = serialize($history);
+
+ $usersProperties->update($userProperty);
+
+ if (class_exists('redirectDetail')) {
+
+ if (isset($RBAC->aUserInfo['PROCESSMAKER']['ROLE']['ROL_CODE'])) {
+ $userRole = $RBAC->aUserInfo['PROCESSMAKER']['ROLE']['ROL_CODE'];
+ }
+ $pluginRegistry = PluginRegistry::loadSingleton();
+
+ $redirectLogin = $pluginRegistry->getRedirectLogins();
+ if (isset($redirectLogin)) {
+ if (is_array($redirectLogin)) {
+ foreach ($redirectLogin as $detail) {
+ if (isset($detail->sPathMethod)) {
+ if ($detail->equalRoleCodeTo($userRole)) {
+ $user['__REDIRECT_PATH__'] = '/sys' . config('system.workspace') . '/' . SYS_LANG . '/' . SYS_SKIN . '/' . $detail->getPathMethod();
+ return $user;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ $lang = "";
+ if ($userLang !== "") {
+ $lang = $userLang;
+ } else {
+ if (defined('SYS_LANG')) {
+ $lang = SYS_LANG;
+ } else {
+ $lang = 'en';
+ }
+ }
+ $location = $usersProperties->redirectTo($usrUid, $lang);
+ $user['__REDIRECT_PATH__'] = $location;
+ return $user;
+ }
}
diff --git a/workflow/engine/xmlform/cases/cases_Resume_Current_Task.xml b/workflow/engine/xmlform/cases/cases_Resume_Current_Task.xml
index f251935e7..4e80eea7a 100644
--- a/workflow/engine/xmlform/cases/cases_Resume_Current_Task.xml
+++ b/workflow/engine/xmlform/cases/cases_Resume_Current_Task.xml
@@ -1,5 +1,5 @@
-
-
+
+
diff --git a/workflow/engine/xmlform/cases/cases_Resume_Current_Task_Title.xml b/workflow/engine/xmlform/cases/cases_Resume_Current_Task_Title.xml
index 778e802cb..d6628fb8c 100644
--- a/workflow/engine/xmlform/cases/cases_Resume_Current_Task_Title.xml
+++ b/workflow/engine/xmlform/cases/cases_Resume_Current_Task_Title.xml
@@ -1,6 +1,6 @@
-
-
-
+
+
+
diff --git a/workflow/engine/xmlform/login/changePasswordpm3.html b/workflow/engine/xmlform/login/changePasswordpm3.html
index ecbc54b0a..ae71c164c 100644
--- a/workflow/engine/xmlform/login/changePasswordpm3.html
+++ b/workflow/engine/xmlform/login/changePasswordpm3.html
@@ -14,6 +14,7 @@
{$form.USR_PASSWORD}
{$form.USR_PASSWORD_CONFIRM}
+ {$form.__USR_PASSWORD_CHANGE__}