Merge remote-tracking branch 'origin/release/3.3.10' into bugfix/PMC-580

This commit is contained in:
Paula Quispe
2019-05-07 14:47:08 -04:00
8 changed files with 183 additions and 62 deletions

View File

@@ -3541,19 +3541,19 @@ class Cases
*/ */
if ($oPMScript->executedOn() === $oPMScript::AFTER_ROUTING) { if ($oPMScript->executedOn() === $oPMScript::AFTER_ROUTING) {
//Get the variables changed with the trigger //Get the variables changed with the trigger
$fieldsTrigger = arrayDiffRecursive($appDataAfterTrigger, $fieldsCase); $fieldsTrigger = getDiffBetweenModifiedVariables($appDataAfterTrigger, $fieldsCase);
$collection = collect($fieldsCase);
$merged = $collection->merge($fieldsTrigger);
//Merge the appData with variables changed
$fieldsCase = $merged->all();
//We will be load the last appData because: //We will be load the last appData because:
//Other thread execution can be changed the variables //Other thread execution can be changed the variables
$appUid = !empty($fieldsCase['APPLICATION']) ? $fieldsCase['APPLICATION'] : ''; $appUid = !empty($fieldsCase['APPLICATION']) ? $fieldsCase['APPLICATION'] : '';
//Save the fields changed in the trigger //Save the fields changed in the trigger
if (!$varInAfterRouting && !empty($fieldsTrigger)) { if (!$varInAfterRouting && !empty($fieldsTrigger)) {
$varInAfterRouting = true; $varInAfterRouting = true;
} }
//Merge the appData with variables changed
$fieldsCase = array_merge($fieldsCase, $fieldsTrigger);
} else { } else {
$fieldsCase = $appDataAfterTrigger; $fieldsCase = $appDataAfterTrigger;
} }

View File

@@ -1132,23 +1132,7 @@ class PmDynaform
if (!isset($this->fields["APP_DATA"]["__DYNAFORM_OPTIONS"]["PREVIOUS_STEP"])) { if (!isset($this->fields["APP_DATA"]["__DYNAFORM_OPTIONS"]["PREVIOUS_STEP"])) {
$this->fields["APP_DATA"]["__DYNAFORM_OPTIONS"]["PREVIOUS_STEP"] = ""; $this->fields["APP_DATA"]["__DYNAFORM_OPTIONS"]["PREVIOUS_STEP"] = "";
} }
$msg = ""; $title = $this->getSessionMessage() .
if (isset($_SESSION['G_MESSAGE_TYPE']) && isset($_SESSION['G_MESSAGE'])) {
$color = "green";
if ($_SESSION['G_MESSAGE_TYPE'] === "ERROR") {
$color = "red";
}
if ($_SESSION['G_MESSAGE_TYPE'] === "WARNING") {
$color = "#C3C380";
}
if ($_SESSION['G_MESSAGE_TYPE'] === "INFO") {
$color = "green";
}
$msg = "<div style='background-color:" . $color . ";color: white;padding: 1px 2px 1px 5px;' class='userGroupTitle'>" . $_SESSION['G_MESSAGE_TYPE'] . ": " . $_SESSION['G_MESSAGE'] . "</div>";
unset($_SESSION['G_MESSAGE_TYPE']);
unset($_SESSION['G_MESSAGE']);
}
$title = $msg .
"<table width='100%' align='center'>\n" . "<table width='100%' align='center'>\n" .
" <tr class='userGroupTitle'>\n" . " <tr class='userGroupTitle'>\n" .
" <td width='100%' align='center'>" . G::LoadTranslation('ID_CASE') . " #: " . $this->fields["APP_NUMBER"] . "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . G::LoadTranslation('ID_TITLE') . ": " . $this->fields["APP_TITLE"] . "</td>\n" . " <td width='100%' align='center'>" . G::LoadTranslation('ID_CASE') . " #: " . $this->fields["APP_NUMBER"] . "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . G::LoadTranslation('ID_TITLE') . ": " . $this->fields["APP_TITLE"] . "</td>\n" .
@@ -1199,19 +1183,8 @@ class PmDynaform
public function printEditSupervisor() public function printEditSupervisor()
{ {
ob_clean(); ob_clean();
$json = G::json_decode($this->record["DYN_CONTENT"]); $json = G::json_decode($this->record["DYN_CONTENT"]);
$this->jsonr($json); $this->jsonr($json);
$msg = "";
if (isset($_SESSION["G_MESSAGE_TYPE"]) && isset($_SESSION["G_MESSAGE"])) {
$msg = "<div style=\"margin: 1.2em; border: 1px solid #3C763D; padding: 0.5em; background: #B2D3B3;\"><strong>" . G::LoadTranslation("ID_INFO") . "</strong>: " . $_SESSION["G_MESSAGE"] . "</div>";
unset($_SESSION["G_MESSAGE_TYPE"]);
unset($_SESSION["G_MESSAGE"]);
}
$javascrip = " $javascrip = "
<script type=\"text/javascript\"> <script type=\"text/javascript\">
var jsondata = " . G::json_encode($json) . "; var jsondata = " . G::json_encode($json) . ";
@@ -1234,11 +1207,9 @@ class PmDynaform
var leaveCaseWarning = " . $this->getLeaveCaseWarning() . "; var leaveCaseWarning = " . $this->getLeaveCaseWarning() . ";
" . $this->getTheStringVariableForGoogleMaps() . " " . $this->getTheStringVariableForGoogleMaps() . "
</script> </script>
<script type=\"text/javascript\" src=\"/jscore/cases/core/pmDynaform.js\"></script> <script type=\"text/javascript\" src=\"/jscore/cases/core/pmDynaform.js\"></script>
<div> <div>
$msg " . $this->getSessionMessageForSupervisor() . "
<div style=\"display: none;\"> <div style=\"display: none;\">
<a id=\"dyn_forward\" href=\"javascript:;\"></a> <a id=\"dyn_forward\" href=\"javascript:;\"></a>
</div> </div>
@@ -1323,6 +1294,7 @@ class PmDynaform
$this->getTheStringVariableForGoogleMaps() . "\n" . $this->getTheStringVariableForGoogleMaps() . "\n" .
"</script>\n" . "</script>\n" .
"<script type='text/javascript' src='/jscore/cases/core/pmDynaform.js'></script>\n" . "<script type='text/javascript' src='/jscore/cases/core/pmDynaform.js'></script>\n" .
$this->getSessionMessage() .
"<div style='width:100%;padding: 0px 10px 0px 10px;margin:15px 0px 0px 0px;'>\n" . "<div style='width:100%;padding: 0px 10px 0px 10px;margin:15px 0px 0px 0px;'>\n" .
" <a id='dyn_forward' href='' style='float:right;font-size:12px;line-height:1;margin:0px 5px 1px 0px;'>\n" . " <a id='dyn_forward' href='' style='float:right;font-size:12px;line-height:1;margin:0px 5px 1px 0px;'>\n" .
" </a>\n" . " </a>\n" .
@@ -2238,4 +2210,53 @@ class PmDynaform
$result = 'var googleMaps = ' . G::json_encode($googleMaps) . ';'; $result = 'var googleMaps = ' . G::json_encode($googleMaps) . ';';
return $result; return $result;
} }
/**
* Get session message.
*
* @return string
*
* @see PmDynaform->printEdit()
* @see PmDynaform->printABE()
* @link https://wiki.processmaker.com/3.1/Multiple_File_Uploader#File_Extensions
*/
public function getSessionMessage()
{
$message = "";
if (isset($_SESSION['G_MESSAGE_TYPE']) && isset($_SESSION['G_MESSAGE'])) {
$color = "green";
if ($_SESSION['G_MESSAGE_TYPE'] === "ERROR") {
$color = "red";
}
if ($_SESSION['G_MESSAGE_TYPE'] === "WARNING") {
$color = "#C3C380";
}
if ($_SESSION['G_MESSAGE_TYPE'] === "INFO") {
$color = "green";
}
$message = "<div style='background-color:" . $color . ";color: white;padding: 1px 2px 1px 5px;' class='userGroupTitle'>" . $_SESSION['G_MESSAGE_TYPE'] . ": " . $_SESSION['G_MESSAGE'] . "</div>";
unset($_SESSION['G_MESSAGE_TYPE']);
unset($_SESSION['G_MESSAGE']);
}
return $message;
}
/**
* Get session message for supervisor.
*
* @return string
*
* @see PmDynaform->printEditSupervisor();
* @link https://wiki.processmaker.com/3.1/Multiple_File_Uploader#File_Extensions
*/
public function getSessionMessageForSupervisor()
{
$message = "";
if (isset($_SESSION["G_MESSAGE_TYPE"]) && isset($_SESSION["G_MESSAGE"])) {
$message = "<div style=\"margin: 1.2em; border: 1px solid #3C763D; padding: 0.5em; background: #B2D3B3;\"><strong>" . G::LoadTranslation("ID_INFO") . "</strong>: " . $_SESSION["G_MESSAGE"] . "</div>";
unset($_SESSION["G_MESSAGE_TYPE"]);
unset($_SESSION["G_MESSAGE"]);
}
return $message;
}
} }

View File

@@ -1006,4 +1006,24 @@ class PmTable
} }
return $oCriteria; return $oCriteria;
} }
/**
* Get the type of the column ex: string, int, double, boolean
*
* @param string $pmTablePeer
* @param string $tableName
* @param string $columnName
*
* @return string
*/
public static function getTypeOfColumn($pmTablePeer, $tableName, $columnName)
{
try {
$type = $pmTablePeer::getMapBuilder()->getDatabaseMap()->getTable($tableName)->getColumn($columnName)->getCreoleType();
} catch (Exception $e) {
return '';
}
return $type;
}
} }

View File

@@ -50,12 +50,18 @@ if (!isset($_SESSION['USER_LOGGED'])) {
} }
} }
ValidationUploadedFiles::getValidationUploadedFiles()->dispatch(function($validator) { /**
* To do: The following evaluation must be moved after saving the data (so as not to lose the data entered in the form).
* It only remains because it is an old behavior, which must be defined by "Product Owner".
* @see workflow/engine/methods/services/ActionsByEmailDataFormPost.php
*/
$validator = ValidationUploadedFiles::getValidationUploadedFiles()->runRulesForFileEmpty();
if ($validator->fails()) {
G::SendMessageText($validator->getMessage(), "ERROR"); G::SendMessageText($validator->getMessage(), "ERROR");
$url = explode("sys" . config("system.workspace"), $_SERVER['HTTP_REFERER']); $url = explode("sys" . config("system.workspace"), $_SERVER['HTTP_REFERER']);
G::header("location: " . "/sys" . config("system.workspace") . $url[1]); G::header("location: " . "/sys" . config("system.workspace") . $url[1]);
die(); die();
}); }
try { try {
if ($_GET['APP_UID'] !== $_SESSION['APPLICATION']) { if ($_GET['APP_UID'] !== $_SESSION['APPLICATION']) {

View File

@@ -5,11 +5,26 @@
* @link https://wiki.processmaker.com/3.3/Actions_by_Email#Link_to_Fill_a_Form * @link https://wiki.processmaker.com/3.3/Actions_by_Email#Link_to_Fill_a_Form
*/ */
use ProcessMaker\ChangeLog\ChangeLog;
use ProcessMaker\BusinessModel\Cases\InputDocument; use ProcessMaker\BusinessModel\Cases\InputDocument;
use ProcessMaker\ChangeLog\ChangeLog;
use ProcessMaker\Validation\ValidationUploadedFiles;
if (PMLicensedFeatures::getSingleton() if (PMLicensedFeatures::getSingleton()
->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=')) { ->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=')) {
/**
* To do: The following evaluation must be moved after saving the data (so as not to lose the data entered in the form).
* It only remains because it is an old behavior, which must be defined by "Product Owner".
* @see workflow/engine/methods/cases/cases_SaveData.php
*/
$validator = ValidationUploadedFiles::getValidationUploadedFiles()->runRulesForFileEmpty();
if ($validator->fails()) {
G::SendMessageText($validator->getMessage(), "ERROR");
$url = explode("sys" . config("system.workspace"), $_SERVER['HTTP_REFERER']);
G::header("location: " . "/sys" . config("system.workspace") . $url[1]);
die();
}
$G_PUBLISH = new Publisher(); $G_PUBLISH = new Publisher();
try { try {

View File

@@ -21,6 +21,7 @@ use BpmnEngineServicesSearchIndex;
use Cases as ClassesCases; use Cases as ClassesCases;
use CasesPeer; use CasesPeer;
use Configurations; use Configurations;
use CreoleTypes;
use Criteria; use Criteria;
use DBAdapter; use DBAdapter;
use EntitySolrRequestData; use EntitySolrRequestData;
@@ -32,6 +33,7 @@ use InputDocument;
use InvalidIndexSearchTextException; use InvalidIndexSearchTextException;
use ListParticipatedLast; use ListParticipatedLast;
use PmDynaform; use PmDynaform;
use PmTable;
use ProcessMaker\BusinessModel\ProcessSupervisor as BmProcessSupervisor; use ProcessMaker\BusinessModel\ProcessSupervisor as BmProcessSupervisor;
use ProcessMaker\BusinessModel\Task as BmTask; use ProcessMaker\BusinessModel\Task as BmTask;
use ProcessMaker\BusinessModel\User as BmUser; use ProcessMaker\BusinessModel\User as BmUser;
@@ -39,16 +41,16 @@ use ProcessMaker\Core\System;
use ProcessMaker\Exception\UploadException; use ProcessMaker\Exception\UploadException;
use ProcessMaker\Plugins\PluginRegistry; use ProcessMaker\Plugins\PluginRegistry;
use ProcessMaker\Services\OAuth2\Server; use ProcessMaker\Services\OAuth2\Server;
use ProcessMaker\Util\DateTime as UtilDateTime;
use ProcessMaker\Validation\ExceptionRestApi; use ProcessMaker\Validation\ExceptionRestApi;
use ProcessMaker\Validation\Validator as FileValidator; use ProcessMaker\Validation\Validator as FileValidator;
use ProcessPeer; use ProcessPeer;
use ProcessUser; use ProcessUser;
use ProcessUserPeer; use ProcessUserPeer;
use RBAC; use RBAC;
use ResultSet; use ResultSet;
use RoutePeer;
use SubApplication; use SubApplication;
use SubProcessPeer;
use Task as ModelTask; use Task as ModelTask;
use TaskPeer; use TaskPeer;
use Tasks as ClassesTasks; use Tasks as ClassesTasks;
@@ -3502,7 +3504,7 @@ class Cases
* @param string $listPeer , name of the list class * @param string $listPeer , name of the list class
* @param string $search , the parameter for search in the table * @param string $search , the parameter for search in the table
* @param string $additionalClassName , name of the className of pmtable * @param string $additionalClassName , name of the className of pmtable
* @param array $additionalColumns , columns related to the custom cases list * @param array $additionalColumns , columns related to the custom cases list ex: TABLE_NAME.COLUMN_NAME
* *
* @throws PropelException * @throws PropelException
*/ */
@@ -3511,31 +3513,35 @@ class Cases
$listPeer, $listPeer,
$search, $search,
$additionalClassName = '', $additionalClassName = '',
$additionalColumns = array() $additionalColumns = []
) { ) {
$oTmpCriteria = ''; $tmpCriteria = '';
//If we have additional tables configured in the custom cases list, prepare the variables for search //If we have additional tables configured in the custom cases list, prepare the variables for search
if (count($additionalColumns) > 0) { if (count($additionalColumns) > 0) {
require_once(PATH_DATA_SITE . 'classes' . PATH_SEP . $additionalClassName . '.php'); require_once(PATH_DATA_SITE . 'classes' . PATH_SEP . $additionalClassName . '.php');
$oNewCriteria = new Criteria("workflow");
$oTmpCriteria = $oNewCriteria->getNewCriterion(current($additionalColumns), "%" . $search . "%", $columnPivot = current($additionalColumns);
Criteria::LIKE); $tableAndColumn = explode(".", $columnPivot);
$type = PmTable::getTypeOfColumn($listPeer, $tableAndColumn[0], $tableAndColumn[1]);
$tmpCriteria = $this->defineCriteriaByColumnType($type, $columnPivot, $search);
//We prepare the query related to the custom cases list //We prepare the query related to the custom cases list
foreach (array_slice($additionalColumns, 1) as $value) { foreach (array_slice($additionalColumns, 1) as $column) {
$oTmpCriteria = $oNewCriteria->getNewCriterion($value, "%" . $search . "%", $tableAndColumn = explode(".", $column);
Criteria::LIKE)->addOr($oTmpCriteria); $type = PmTable::getTypeOfColumn($listPeer, $tableAndColumn[0], $tableAndColumn[1]);
$tmpCriteria = $this->defineCriteriaByColumnType($type, $column, $search)->addOr($tmpCriteria);
} }
} }
if (!empty($oTmpCriteria)) { if (!empty($tmpCriteria)) {
$criteria->add( $criteria->add(
$criteria->getNewCriterion($listPeer::APP_TITLE, '%' . $search . '%', Criteria::LIKE)->addOr( $criteria->getNewCriterion($listPeer::APP_TITLE, '%' . $search . '%', Criteria::LIKE)->addOr(
$criteria->getNewCriterion($listPeer::APP_TAS_TITLE, '%' . $search . '%', Criteria::LIKE)->addOr( $criteria->getNewCriterion($listPeer::APP_TAS_TITLE, '%' . $search . '%', Criteria::LIKE)->addOr(
$criteria->getNewCriterion($listPeer::APP_PRO_TITLE, '%' . $search . '%', $criteria->getNewCriterion($listPeer::APP_PRO_TITLE, '%' . $search . '%',
Criteria::LIKE)->addOr( Criteria::LIKE)->addOr(
$criteria->getNewCriterion($listPeer::APP_NUMBER, $search, Criteria::EQUAL)->addOr( $criteria->getNewCriterion($listPeer::APP_NUMBER, $search, Criteria::EQUAL)->addOr(
$oTmpCriteria $tmpCriteria
)))) ))))
); );
} else { } else {
@@ -3549,6 +3555,58 @@ class Cases
} }
} }
/**
* Define the criteria according to the column type
*
* @param string $fieldType
* @param string $column
* @param string $search
*
* @return Criteria
*/
private function defineCriteriaByColumnType($fieldType, $column, $search)
{
$newCriteria = new Criteria("workflow");
switch ($fieldType) {
case CreoleTypes::BOOLEAN:
$criteria = $newCriteria->getNewCriterion($column, $search, Criteria::EQUAL);
break;
case CreoleTypes::BIGINT:
case CreoleTypes::INTEGER:
case CreoleTypes::SMALLINT:
case CreoleTypes::TINYINT:
$criteria = $newCriteria->getNewCriterion($column, $search, Criteria::EQUAL);
break;
case CreoleTypes::REAL:
case CreoleTypes::DECIMAL:
case CreoleTypes::DOUBLE:
case CreoleTypes::FLOAT:
$criteria = $newCriteria->getNewCriterion($column, $search, Criteria::LIKE);
break;
case CreoleTypes::CHAR:
case CreoleTypes::LONGVARCHAR:
case CreoleTypes::VARCHAR:
$criteria = $newCriteria->getNewCriterion($column, "%" . $search . "%", Criteria::LIKE);
break;
case CreoleTypes::DATE:
case CreoleTypes::TIME:
case CreoleTypes::TIMESTAMP://DATETIME
//@todo use the same constant in other places
if (preg_match(UtilDateTime::REGEX_IS_DATE,
$search, $arrayMatch)) {
$criteria = $newCriteria->getNewCriterion($column, $search, Criteria::GREATER_EQUAL);
} else {
$criteria = $newCriteria->getNewCriterion($column, $search, Criteria::EQUAL);
}
break;
default:
$criteria = $newCriteria->getNewCriterion($column, $search, Criteria::EQUAL);
}
return $criteria;
}
/** /**
* This function get the table.column by order by the result * This function get the table.column by order by the result
* We can include the additional table related to the custom cases list * We can include the additional table related to the custom cases list

View File

@@ -7,6 +7,7 @@ class DateTime
const REGEXPDATE = '[1-9]\d{3}\-(?:0[1-9]|1[0-2])\-(?:0[1-9]|[12][0-9]|3[01])'; const REGEXPDATE = '[1-9]\d{3}\-(?:0[1-9]|1[0-2])\-(?:0[1-9]|[12][0-9]|3[01])';
const REGEXPTIME = '(?:[0-1]\d|2[0-3])\:[0-5]\d\:[0-5]\d'; const REGEXPTIME = '(?:[0-1]\d|2[0-3])\:[0-5]\d\:[0-5]\d';
const REGEX_IS_DATE = '/^([1-9]\d{3})\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])(?:\s([0-1]\d|2[0-3])\:([0-5]\d)\:([0-5]\d))?$/';
/** /**
* Get Time Zone Offset by Time Zone ID * Get Time Zone Offset by Time Zone ID

View File

@@ -401,27 +401,27 @@ function verifyCsrfToken($request)
} }
/** /**
* Get the difference between to multidimensional array * Get the difference between to arrays
* If the element is an array we will to keep the value from $array1
* If the element is an object we will to keep the value from $array1
* *
* @param array $array1 * @param array $array1
* @param array $array2 * @param array $array2
* *
* @return array * @return array
*/ */
function arrayDiffRecursive(array $array1, array $array2) function getDiffBetweenModifiedVariables(array $array1, array $array2)
{ {
$difference = []; $difference = [];
foreach ($array1 as $key => $value) { foreach ($array1 as $key => $value) {
if (is_array($value)) { if (is_array($value)) {
if (!isset($array2[$key])) { if ($value !== $array2[$key]) {
$difference[$key] = $value; $difference[$key] = $value;
} elseif (!is_array($array2[$key])) { }
} elseif (is_object($value)) {
// When using ===, it means object variables are identical and they refer to the same instance of the same class.
if ($value != $array2[$key]) {
$difference[$key] = $value; $difference[$key] = $value;
} else {
$new_diff = arrayDiffRecursive($value, $array2[$key]);
if (!empty($new_diff)) {
$difference[$key] = $new_diff;
}
} }
} elseif (!isset($array2[$key]) || $array2[$key] != $value) { } elseif (!isset($array2[$key]) || $array2[$key] != $value) {
$difference[$key] = $value; $difference[$key] = $value;