Merge remote-tracking branch 'upstream/3.1' into HOR-998

This commit is contained in:
dheeyi william
2016-07-19 10:12:49 -04:00
60 changed files with 1659 additions and 915 deletions

View File

@@ -493,7 +493,7 @@ class InputDocument
*
* return array Return an array with data of an InputDocument
*/
public function addCasesInputDocument($applicationUid, $taskUid, $appDocComment, $inputDocumentUid, $userUid)
public function addCasesInputDocument($applicationUid, $taskUid, $appDocComment, $inputDocumentUid, $userUid, $runningWorkflow = true)
{
try {
if ((isset( $_FILES['form'] )) && ($_FILES['form']['error'] != 0)) {
@@ -535,7 +535,60 @@ class InputDocument
$appDocType = 'INPUT';
$case = new \Cases();
$delIndex = \AppDelegation::getCurrentIndex($applicationUid);
$case->thisIsTheCurrentUser($applicationUid, $delIndex, $userUid, "REDIRECT", "casesListExtJs");
if ($runningWorkflow) {
$case->thisIsTheCurrentUser($applicationUid, $delIndex, $userUid, 'REDIRECT', 'casesListExtJs');
} else {
$criteria = new \Criteria('workflow');
$criteria->add(\AppDelegationPeer::APP_UID, $applicationUid);
$criteria->add(\AppDelegationPeer::DEL_INDEX, $delIndex);
$criteria->add(\AppDelegationPeer::USR_UID, $userUid);
$rsCriteria = \ProcessUserPeer::doSelectRS($criteria);
if (!$rsCriteria->next()) {
$case2 = new \ProcessMaker\BusinessModel\Cases();
$arrayApplicationData = $case2->getApplicationRecordByPk($applicationUid, [], false);
$msg = '';
$supervisor = new \ProcessMaker\BusinessModel\ProcessSupervisor();
$flagps = $supervisor->isUserProcessSupervisor($arrayApplicationData['PRO_UID'], $userUid);
if ($flagps == false) {
$msg = \G::LoadTranslation('ID_USER_NOT_IT_BELONGS_CASE_OR_NOT_SUPERVISOR');
}
if ($msg == '') {
$criteria = new \Criteria('workflow');
$criteria->add(\StepSupervisorPeer::PRO_UID, $arrayApplicationData['PRO_UID'], \Criteria::EQUAL);
$criteria->add(\StepSupervisorPeer::STEP_TYPE_OBJ, 'INPUT_DOCUMENT', \Criteria::EQUAL);
$criteria->add(\StepSupervisorPeer::STEP_UID_OBJ, $inputDocumentUid, \Criteria::EQUAL);
$rsCriteria = \StepSupervisorPeer::doSelectRS($criteria);
if (!$rsCriteria->next()) {
$msg = \G::LoadTranslation('ID_USER_IS_SUPERVISOR_DOES_NOT_ASSOCIATED_INPUT_DOCUMENT');
}
}
if ($msg != '') {
if ($runningWorkflow) {
\G::SendMessageText($msg, 'ERROR');
$backUrlObj = explode('sys' . SYS_SYS, $_SERVER['HTTP_REFERER']);
\G::header('location: ' . '/sys' . SYS_SYS . $backUrlObj[1]);
exit(0);
} else {
throw new \Exception($msg);
}
}
}
}
//Load the fields
$arrayField = $case->loadCase($applicationUid);
$arrayField["APP_DATA"] = array_merge($arrayField["APP_DATA"], \G::getSystemConstants());

View File

@@ -179,10 +179,13 @@ class NotificationDevice
}
$userIds = $arrayTaskUser;
//sub process
$taskAssignType = (isset($nextDel["TAS_ASSIGN_TYPE"])) ? $nextDel["TAS_ASSIGN_TYPE"] : $nextDel["SP_TYPE"];
$message = '#' . $appFields['APP_NUMBER'] . ' : ' . $appFields['APP_TITLE'];
$data = array(
'processId' => $appFields['PRO_UID'],
'taskId' => $nextDel["TAS_UID"],
'taskAssignType' => $taskAssignType,
'caseId' => $appFields['APP_UID'],
'caseTitle' => $appFields['APP_TITLE'],
'delIndex' => $iNewDelIndex,
@@ -281,5 +284,4 @@ class NotificationDevice
return $arrayTaskUser;
}
}

View File

@@ -100,17 +100,19 @@ class PushMessageIOS
// $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
// if (!$fp)
// exit("Failed to connect: $err $errstr" . PHP_EOL);
$alert = new \stdClass();
$alert->{'loc-key'} = $data['taskAssignType'];
$alert->{'loc-args'} = array($message);
// Create the payload body
if (!is_null($data)) {
$body['aps'] = array(
'alert' => $message,
'alert' => $alert,
'sound' => 'default',
'data' => $data
);
} else {
$body['aps'] = array(
'alert' => $message,
'alert' => $alert,
'sound' => 'default'
);
}

View File

@@ -1523,5 +1523,57 @@ class ProcessSupervisor
$oCriteria->setStepPosition($pos);
$oCriteria->save();
}
}
/**
* Validate if the user is supervisor of the process
*
* @param string $projectUid Unique id of process
* @param string $userUid Unique id of User
*
* @return bool Return
*/
public function isUserProcessSupervisor($projectUid, $userUid)
{
try {
$criteria = new \Criteria('workflow');
$criteria->add(\ProcessUserPeer::USR_UID, $userUid, \Criteria::EQUAL);
$criteria->add(\ProcessUserPeer::PRO_UID, $projectUid, \Criteria::EQUAL);
$criteria->add(\ProcessUserPeer::PU_TYPE, 'SUPERVISOR', \Criteria::EQUAL);
$rsCriteria = \ProcessUserPeer::doSelectRS($criteria);
$rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
if ($rsCriteria->next()) {
return true;
}
$criteria = new \Criteria('workflow');
$criteria->addSelectColumn(\ProcessUserPeer::USR_UID);
$criteria->add(\ProcessUserPeer::PRO_UID, $projectUid, \Criteria::EQUAL);
$criteria->add(\ProcessUserPeer::PU_TYPE, 'GROUP_SUPERVISOR', \Criteria::EQUAL);
$rsCriteria = \ProcessUserPeer::doSelectRS($criteria);
$rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
while ($rsCriteria->next()) {
$record = $rsCriteria->getRow();
$groupUid = $record['USR_UID'];
$obj = \GroupUserPeer::retrieveByPK($groupUid, $userUid);
if (!is_null($obj)) {
return true;
}
}
//Return
return false;
} catch (\Exception $e) {
throw $e;
}
}
}

View File

@@ -150,8 +150,12 @@ class Table
*
* @return array
*/
public function getTableData($tab_uid, $pro_uid = '', $reportFlag = false)
public function getTableData($tab_uid, $pro_uid = '', $filter = null, $reportFlag = false)
{
//Validation
$inputFilter = new \InputFilter();
$filter = $inputFilter->sanitizeInputValue($filter, 'nosql');
//VALIDATION
if ($reportFlag) {
$pro_uid = $this->validateProUid($pro_uid);
@@ -160,7 +164,7 @@ class Table
$additionalTables = new AdditionalTables();
$table = $additionalTables->load($tab_uid, true);
$result = $additionalTables->getAllData($tab_uid);
$result = $additionalTables->getAllData($tab_uid, null, null, null, $filter);
$primaryKeys = $additionalTables->getPrimaryKeys();
if (is_array($result['rows'])) {
foreach ($result['rows'] as $i => $row) {

View File

@@ -922,6 +922,7 @@ class Variable
$sqlOrderBy = " ORDER BY " . $sFieldSel;
}
$start = 0;
$sqlLimit = "";
if ($start >= 0) {
$sqlLimit = " LIMIT " . $start;
@@ -943,17 +944,43 @@ class Variable
$row = $ds->getRow();
if (isset($row["DBS_TYPE"])) {
if ($row["DBS_TYPE"] === "pgsql") {
$sqlLimit = $this->limitPgsql($start, $limit);
if ($start >= 0) {
$sqlLimit = " OFFSET " . $start;
}
if ($limit !== "") {
$sqlLimit = $sqlLimit . " LIMIT " . $limit;
}
}
if ($row["DBS_TYPE"] === "mssql") {
return $this->limitMssqlOracle($sqlSelect, $sqlFrom, $sqlWhere, $sqlGroupBy, $sqlHaving, $sqlOrderBy, $start, $limit, true);
$sqlLimit = "";
if ($limit !== "") {
$wordsSearch = [" DISTINCT ", " ALL "];
$wordsSearchCount = count($wordsSearch);
for ($i = 0; $i < $wordsSearchCount; $i++) {
$stringSearch = $wordsSearch[$i];
$stringPosition = strpos($sqlSelect, $stringSearch);
if ($stringPosition !== false) {
$stringLength = strlen($stringSearch);
$string1 = substr($sqlSelect, 0, $stringPosition + $stringLength);
$string2 = substr($sqlSelect, $stringPosition + $stringLength);
$sqlSelect = $string1 . "TOP(" . $limit . ") " . $string2;
}
}
}
}
if ($row["DBS_TYPE"] === "oracle") {
return $this->limitMssqlOracle($sqlSelect, $sqlFrom, $sqlWhere, $sqlGroupBy, $sqlHaving, $sqlOrderBy, $start, $limit, false);
$sqlLimit = "";
if ($limit !== "") {
if (strpos($sqlWhere, "WHERE ") === false) {
$sqlWhere = " WHERE ROWNUM <= " . $limit;
} else {
$sqlWhere = $sqlWhere . " AND ROWNUM <= " . $limit;
}
}
}
}
return $sqlSelect . $sqlFrom . $sqlWhere . $sqlGroupBy . $sqlHaving . $sqlOrderBy . $sqlLimit;
return $sqlSelect . $sqlFrom . $sqlWhere . $sqlGroupBy . $sqlHaving . " " . $sqlOrderBy . $sqlLimit;
}
if (!empty($sqlParsed['CALL'])) {
$sCall = "CALL ";
@@ -981,36 +1008,6 @@ class Variable
}
}
public function limitPgsql($start = 0, $limit = "")
{
$sqlLimit = "";
if ($start >= 0) {
$sqlLimit = " OFFSET " . $start;
}
if ($limit !== "") {
$sqlLimit = $sqlLimit . " LIMIT " . $limit;
}
return $sqlLimit;
}
public function limitMssqlOracle($sqlSelect = "", $sqlFrom = "", $sqlWhere = "", $sqlGroupBy = "", $sqlHaving = "", $sqlOrderBy = "", $start = 0, $limit = "", $isMssql = true)
{
$sqlLimit = "";
if ($start >= 0) {
$sqlLimit = "WHERE rn >= " . $start;
}
if ($start >= 0 && $limit != "") {
$sqlLimit = "WHERE rn BETWEEN " . $start . " AND " . $limit;
}
$sql = ""
. "SELECT * FROM ("
. " " . $sqlSelect . ", ROW_NUMBER() OVER( " . $sqlOrderBy . " desc )-1 " . ($isMssql ? " AS " : "") . " rn "
. " " . $sqlFrom . $sqlWhere . $sqlGroupBy . $sqlHaving
. ")" . ($isMssql ? " AS A " : "")
. $sqlLimit;
return $sql;
}
public function getVariableTypeByName($processUid, $variableName)
{
try {

View File

@@ -174,11 +174,27 @@ abstract class Importer
/*----------------------------------********---------------------------------*/
if($objectsToImport === ''){
/*----------------------------------********---------------------------------*/
try {
$this->verifyIfTheProcessHasStartedCases();
} catch (\Exception $e) {
throw $e;
}
$this->removeProject();
/*----------------------------------********---------------------------------*/
} else {
$granularObj = new \ProcessMaker\BusinessModel\Migrator\GranularImporter();
$objectList = $granularObj->loadObjectsListSelected($this->importData, $objectsToImport);
try {
foreach ($objectList as $rowObject) {
if ($rowObject['name'] === 'PROCESSDEFINITION') {
$this->verifyIfTheProcessHasStartedCases();
}
}
} catch (\Exception $e) {
$exception = new ImportException($e->getMessage());
$exception->setNameException($e->getMessage());
throw $exception;
}
try {
foreach ($objectList as $rowObject) {
if ($rowObject['name'] === 'PROCESSDEFINITION') {
@@ -351,6 +367,46 @@ abstract class Importer
$project->remove(true, false, $onlyDiagram);
}
/**
* Check tasks that have cases.
*
* @return boolean
*/
public function verifyIfTheProcessHasStartedCases()
{
$tasksIds = array();
$importedTasks = $this->importData["tables"]["workflow"]["tasks"];
foreach ($importedTasks as $value) {
$tasksIds[] = $value["TAS_UID"];
}
$criteria = new \Criteria("workflow");
$criteria->addSelectColumn(\TaskPeer::TAS_UID);
$criteria->add(\TaskPeer::PRO_UID, $this->metadata["uid"], \Criteria::EQUAL);
$criteria->add(\TaskPeer::TAS_UID, $tasksIds, \Criteria::NOT_IN);
$ds = \TaskPeer::doSelectRS($criteria);
$ds->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
$tasksEliminatedIds = array();
while ($ds->next()) {
$row = $ds->getRow();
$tasksEliminatedIds[] = $row["TAS_UID"];
}
$criteria = new \Criteria("workflow");
$criteria->addSelectColumn(\AppDelegationPeer::TAS_UID);
$criteria->add(\AppDelegationPeer::PRO_UID, $this->metadata["uid"], \Criteria::EQUAL);
$criteria->add(\AppDelegationPeer::DEL_FINISH_DATE, null, \Criteria::ISNULL);
$criteria->add(\AppDelegationPeer::TAS_UID, $tasksEliminatedIds, \Criteria::IN);
$ds = \AppDelegationPeer::doSelectRS($criteria);
$ds->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
$ds->next();
$row = $ds->getRow();
if (isset($row["TAS_UID"])) {
$exception = new \Exception(\G::LoadTranslation("ID_PROCESS_CANNOT_BE_UPDATED_THERE_ARE_TASKS_WITH_ACTIVE_CASES"));
throw $exception;
}
}
/**
* Sets the temporal file save directory
* @param $dirName
@@ -481,7 +537,7 @@ abstract class Importer
foreach ($arrayWorkflowTables["tasks"] as $key => $value) {
$arrayTaskData = $value;
if (!in_array($arrayTaskData["TAS_TYPE"], array("GATEWAYTOGATEWAY", "WEBENTRYEVENT", "END-MESSAGE-EVENT", "START-MESSAGE-EVENT", "INTERMEDIATE-THROW-MESSAGE-EVENT", "INTERMEDIATE-CATCH-MESSAGE-EVENT", "START-TIMER-EVENT", "INTERMEDIATE-CATCH-TIMER-EVENT", "END-EMAIL-EVENT", "INTERMEDIATE-EMAIL-EVENT"))) {
if (!in_array($arrayTaskData["TAS_TYPE"], array("GATEWAYTOGATEWAY", "WEBENTRYEVENT", "END-MESSAGE-EVENT", "START-MESSAGE-EVENT", "INTERMEDIATE-THROW-MESSAGE-EVENT", "INTERMEDIATE-CATCH-MESSAGE-EVENT", "START-TIMER-EVENT", "INTERMEDIATE-CATCH-TIMER-EVENT", "END-EMAIL-EVENT", "INTERMEDIATE-THROW-EMAIL-EVENT"))) {
$result = $workflow->updateTask($arrayTaskData["TAS_UID"], $arrayTaskData);
}
}

View File

@@ -0,0 +1,105 @@
<?php
namespace ProcessMaker\Policies;
use \Luracast\Restler\iAuthenticate;
use \Luracast\Restler\RestException;
use \Luracast\Restler\Defaults;
use \Luracast\Restler\Util;
use \Luracast\Restler\Scope;
use \OAuth2\Request;
use \ProcessMaker\Services\OAuth2\Server;
use \ProcessMaker\BusinessModel\User;
class AccessControl implements iAuthenticate
{
public static $role;
public static $permission;
public static $className;
private $userUid = null;
private $oUser;
/**
* This method checks if an endpoint permission or permissions access
*
* @return bool
* @throws RestException
*/
public function __isAllowed()
{
$response = true;
$oServerOauth = new Server();
$this->oUser = new User();
$server = $oServerOauth->getServer();
$request = Request::createFromGlobals();
$allowed = $server->verifyResourceRequest($request);
$this->userUid = $oServerOauth->getUserId();
$this->oUser->loadUserRolePermission('PROCESSMAKER', $this->userUid);
$metadata = Util::nestedValue($this->restler, 'apiMethodInfo', 'metadata');
if ($allowed && !empty($this->userUid) && (!empty($metadata['access']) && $metadata['access'] == 'protected')) {
$parameters = Util::nestedValue($this->restler, 'apiMethodInfo', 'parameters');
if (!is_null(self::$className) && is_string(self::$className)) {
$authObj = Scope::get(self::$className);
$authObj->parameters = $parameters;
$authObj->permission = self::$permission;
if (!method_exists($authObj, Defaults::$authenticationMethod)) {
throw new RestException (
500,
'Authentication Class should implement iAuthenticate');
} elseif (!$authObj->{Defaults::$authenticationMethod}()) {
throw new RestException(401);
}
} elseif (!$this->verifyAccess(self::$permission)) {
throw new RestException(401);
}
}
return $response;
}
/**
* @return string
*/
public function __getWWWAuthenticateString()
{
return '';
}
/**
* @param $permissions
* @return bool
*/
public function verifyAccess($permissions)
{
$response = false;
$access = -1;
if (!is_array($permissions)) {
$access = $this->userCanAccess($permissions);
} elseif (count($permissions) > 0) {
foreach ($permissions as $perm) {
$access = $this->userCanAccess($perm);
if ($access == 1) {
break;
}
}
}
if ($access == 1 || empty($permissions)) {
$response = true;
}
return $response;
}
public function userCanAccess($perm)
{
$res = -1;
$permissions = Util::nestedValue($this->oUser, 'aUserInfo', 'PROCESSMAKER', 'PERMISSIONS');
if (isset($permissions)) {
$res = -3;
foreach ($permissions as $key => $val) {
if ($perm == $val['PER_CODE']) {
$res = 1;
break;
}
}
}
return $res;
}
}

View File

@@ -31,7 +31,8 @@ class BpmnWorkflow extends Project\Bpmn
"intermediate-catch-message-event" => array("type" => "INTERMEDIATE-CATCH-MESSAGE-EVENT", "prefix" => "icme-"),
"start-timer-event" => array("type" => "START-TIMER-EVENT", "prefix" => "ste-"),
"intermediate-catch-timer-event" => array("type" => "INTERMEDIATE-CATCH-TIMER-EVENT", "prefix" => "icte-"),
"end-email-event" => array("type" => "END-EMAIL-EVENT", "prefix" => "eee-")
"end-email-event" => array("type" => "END-EMAIL-EVENT", "prefix" => "eee-"),
"intermediate-throw-email-event" => array("type" => "INTERMEDIATE-THROW-EMAIL-EVENT", "prefix" => "itee-")
);
private $arrayElementTaskRelation = array();
@@ -885,10 +886,6 @@ class BpmnWorkflow extends Project\Bpmn
\BpmnFlowPeer::FLO_ELEMENT_ORIGIN_TYPE => "bpmnGateway"
));
//if ($arrayFlow > 0) {
// $this->wp->resetTaskRoutes($activityUid);
//}
foreach ($arrayFlow as $value) {
$arrayFlowData = $value->toArray();
@@ -980,12 +977,13 @@ class BpmnWorkflow extends Project\Bpmn
if (!is_null($arrayEventData)) {
$arrayEventType = array("INTERMEDIATE");
$arrayEventMarker = array("MESSAGECATCH", "TIMER");
$arrayEventMarker = array("MESSAGECATCH", "TIMER", "EMAIL");
if (in_array($arrayEventData["EVN_TYPE"], $arrayEventType) && in_array($arrayEventData["EVN_MARKER"], $arrayEventMarker)) {
$arrayKey = array(
"MESSAGECATCH" => "intermediate-catch-message-event",
"TIMER" => "intermediate-catch-timer-event"
"TIMER" => "intermediate-catch-timer-event",
"EMAIL" => "intermediate-throw-email-event"
);
$taskUid = $this->createTaskByElement(

View File

@@ -85,8 +85,9 @@ class InputDocument extends Api
{
try {
$userUid = $this->getUserId();
$inputDocument = new \ProcessMaker\BusinessModel\Cases\InputDocument();
$response = $inputDocument->addCasesInputDocument($app_uid, $tas_uid, $app_doc_comment, $inp_doc_uid, $userUid);
$response = $inputDocument->addCasesInputDocument($app_uid, $tas_uid, $app_doc_comment, $inp_doc_uid, $userUid, false);
return $response;
} catch (\Exception $e) {
throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()));

View File

@@ -902,10 +902,10 @@ class Light extends Api
$dynaForm->setFormatFieldNameInUppercase(false);
$_SESSION['PROCESS'] = $prj_uid;
$response = $dynaForm->getDynaForm($dyn_uid);
$result = $this->parserDataDynaForm($response);
$result['formContent'] = (isset($result['formContent']) && $result['formContent'] != null)?json_decode($result['formContent']):"";
$result = $this->parserDataDynaForm($response);
$result['formContent'] = (isset($result['formContent']) && $result['formContent'] != null) ? \G::json_decode($result['formContent']) : "";
\G::LoadClass("pmDynaform");
$pmDynaForm = new \pmDynaform();
$pmDynaForm = new \pmDynaform(["CURRENT_DYNAFORM" => $dyn_uid]);
$pmDynaForm->jsonr($result['formContent']);
return $result;
} catch (\Exception $e) {

View File

@@ -79,11 +79,11 @@ class Pmtable extends Api
*
* @url GET /:pmt_uid/data
*/
public function doGetPmTableData($pmt_uid)
public function doGetPmTableData($pmt_uid, $filter = null)
{
try {
$oPmTable = new \ProcessMaker\BusinessModel\Table();
$response = $oPmTable->getTableData($pmt_uid);
$response = $oPmTable->getTableData($pmt_uid, null, $filter);
return $response;
} catch (\Exception $e) {
throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()));

View File

@@ -87,7 +87,7 @@ class ReportTable extends Api
{
try {
$oReportTable = new \ProcessMaker\BusinessModel\Table();
$response = $oReportTable->getTableData($rep_uid, $prj_uid, true);
$response = $oReportTable->getTableData($rep_uid, $prj_uid, null, true);
return $response;
} catch (\Exception $e) {
throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()));

View File

@@ -37,10 +37,13 @@ class Common extends \Maveriks\Util\Common
}
$numc = 50;
$total = $numc - 2 - strlen($data);
if($total < 0){
$total = 0;
}
switch ($option) {
case "BAR":
echo "\r" . "| " . $data . str_repeat(" ", $numc - 2 - strlen($data));
echo "\r" . "| " . $data . str_repeat(" ", $total);
break;
case "TEXT":
echo "\r" . '| ' . $data . "\n";