diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 000000000..7d9279ade --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,95 @@ +#!groovy +node { + /** + * Branch should be in gitflow format. If not, then we'll abort. + */ + if(!env.BRANCH_NAME.matches(/(feature|hotfix|bugfix|release)\/.+/) && !env.BRANCH_NAME.matches(/^PR-.*$/)) { + hipchatSend message: "${env.BRANCH_NAME} Build: Does not match gitflow naming. Aborted", room: 'engineering' + error "Job does not follow gitflow naming format." + } + // Parse out our short name and potential jira ticket. Null if not associated. If null, then for now we won't notify + // on jira ticket + def jiraTicket = env.BRANCH_NAME.find(/HOR-\d+/) + + def shortname = env.BRANCH_NAME.replace('/', '-').replace('.', '-').toLowerCase() + def dbSuffix = shortname.replace('-', '') + + echo "Building for ${env.BRANCH_NAME}" + + // Checkout source + checkout scm + + try { + stage('Start Notification') { + if(jiraTicket) { + jiraComment issueKey: jiraTicket, body: "Build ${env.BUILD_NUMBER} Starting.\nTicket will be updated once build is completed.\n\n${env.BUILD_URL}" + } + hipchatSend message: "${env.BRANCH_NAME} Build: ${env.BUILD_NUMBER} Starting.\n${env.BUILD_URL}", room: 'engineering' + } + + stage('Dependencies') { + echo "Running Composer" + sh 'composer install' + echo "Running rake" + sh 'rake' + } + + stage('Generate QA MySQL Databases') { + withCredentials([string(credentialsId: 'qa-rds-hostname', variable: 'rdsHostname'), usernamePassword(credentialsId: 'qa-rds-credentials', passwordVariable: 'rdsPassword', usernameVariable: 'rdsUsername')]) { + echo 'Dropping existing database and recreating.' + sh "mysql -h ${rdsHostname} -u ${rdsUsername} -p${rdsPassword} -e 'drop database if exists qa205${dbSuffix}; create database qa205${dbSuffix}'" + sh "mysql -h ${rdsHostname} -u ${rdsUsername} -p${rdsPassword} -e 'drop database if exists qa300${dbSuffix}; create database qa300${dbSuffix}'" + } + } + + stage('Publish to QA-205') { + sshagent(['processmaker-deploy']) { + echo 'Dropping existing files and recreating' + sh "ssh processmaker@build-qa205.processmaker.net 'rm -Rf /home/processmaker/${shortname}'" + sh "scp -r ./ processmaker@build-qa205.processmaker.net:~/${shortname}" + echo 'Creating necessary directories' + sh "ssh processmaker@build-qa205.processmaker.net 'mkdir -p /home/processmaker/${shortname}/workflow/engine/js/labels'" + sh "ssh processmaker@build-qa205.processmaker.net 'mkdir -p /home/processmaker/${shortname}/workflow/public_html/translations'" + } + } + + stage('Publish to QA-300') { + sshagent(['processmaker-deploy']) { + echo 'Dropping existing files and recreating' + sh "ssh processmaker@build-qa300.processmaker.net 'rm -Rf /home/processmaker/${shortname}'" + sh "scp -r ./ processmaker@build-qa300.processmaker.net:~/${shortname}" + echo 'Creating necessary directories' + sh "ssh processmaker@build-qa300.processmaker.net 'mkdir -p /home/processmaker/${shortname}/workflow/engine/js/labels'" + sh "ssh processmaker@build-qa300.processmaker.net 'mkdir -p /home/processmaker/${shortname}/workflow/public_html/translations'" + } + } + + stage('Success Notification') { + withCredentials([string(credentialsId: 'qa-rds-hostname', variable: 'rdsHostname'), usernamePassword(credentialsId: 'qa-rds-credentials', passwordVariable: 'rdsPassword', usernameVariable: 'rdsUsername')]) { + if(jiraTicket) { + jiraComment issueKey: jiraTicket, body: "" + + "Build ${env.BUILD_NUMBER} Completed.\n" + + "5.6 Build: https://${shortname}.qa205.processmaker.net\n" + + "Database Host: ${rdsHostname}\n" + + "Username: ${rdsUsername}\n" + + "Password: ${rdsPassword}\n" + + "Database: qa205${dbSuffix}\n\n" + + "7.0 Build: https://${shortname}.qa300.processmaker.net\n" + + "Database Host: ${rdsHostname}\n" + + "Username: ${rdsUsername}\n" + + "Password: ${rdsPassword}\n" + + "Database: qa300${dbSuffix}\n\n" + + "${env.BUILD_URL}" + } + hipchatSend room: 'engineering', message: "" + + "${env.BRANCH_NAME} Build: ${env.BUILD_NUMBER} Completed.\n" + + "${env.BUILD_URL}" + } + } + } catch(error) { + if(jiraTicket) { + jiraComment issueKey: jiraTicket, body: "Build ${env.BUILD_NUMBER} Failed: ${error}\n\n${env.BUILD_URL}" + } + hipchatSend message: "${env.BRANCH_NAME} Build: ${env.BUILD_NUMBER} Failed: ${error}\n${env.BUILD_URL}", room: 'engineering' + } +} \ No newline at end of file diff --git a/composer.json b/composer.json index 7fced9261..47bc1a704 100644 --- a/composer.json +++ b/composer.json @@ -29,9 +29,9 @@ "require": { "luracast/restler": "3.0.0-RC5", "bshaffer/oauth2-server-php": "v1.0", - "colosa/pmUI": "3.1-dev", - "colosa/MichelangeloFE": "3.1-dev", - "colosa/pmdynaform": "3.1-dev", + "colosa/pmUI": "release/3.2-dev", + "colosa/MichelangeloFE": "release/3.2-dev", + "colosa/pmdynaform": "release/3.2-dev", "google/apiclient": "1.1.6", "dapphp/securimage": "^3.6", "psr/log":"1.0.0", diff --git a/composer.lock b/composer.lock index d7eb68ccd..66c0b5002 100644 --- a/composer.lock +++ b/composer.lock @@ -52,14 +52,14 @@ }, { "name": "colosa/MichelangeloFE", - "version": "3.1-dev", + "version": "release/3.2-dev", "source": { "type": "git", "url": "git@bitbucket.org:colosa/michelangelofe.git", "reference": "7e889f23a7e8397c052a4d9ae6331334b57c9d48" }, "require": { - "colosa/pmui": "3.1-dev" + "colosa/pmui": "release/3.2-dev" }, "type": "library", "description": "ProcessMaker Michelangelo Front End", @@ -71,7 +71,7 @@ }, { "name": "colosa/pmDynaform", - "version": "3.1-dev", + "version": "release/3.2-dev", "source": { "type": "git", "url": "git@bitbucket.org:colosa/pmdynaform.git", @@ -87,7 +87,7 @@ }, { "name": "colosa/pmUI", - "version": "3.1-dev", + "version": "release/3.2-dev", "source": { "type": "git", "url": "git@bitbucket.org:colosa/pmui.git", @@ -571,7 +571,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "release/3.2-dev" } }, "autoload": { diff --git a/gulliver/system/class.g.php b/gulliver/system/class.g.php index 6b593fb25..39e22b3ff 100644 --- a/gulliver/system/class.g.php +++ b/gulliver/system/class.g.php @@ -1232,8 +1232,10 @@ class G case 'txt': G::sendHeaders( $filename, 'text/html', $download, $downloadFileName ); break; - case 'doc': case 'pdf': + G::sendHeaders( $filename, 'application/pdf', $download, $downloadFileName ); + break; + case 'doc': case 'pm': case 'po': G::sendHeaders( $filename, 'application/octet-stream', $download, $downloadFileName ); @@ -1283,12 +1285,14 @@ class G { if ($download) { if ($downloadFileName == '') { - $aAux = explode( '/', $filename ); - $downloadFileName = $aAux[count( $aAux ) - 1]; + $aAux = explode('/', $filename); + $downloadFileName = $aAux[count($aAux) - 1]; } - header( 'Content-Disposition: attachment; filename="' . $downloadFileName . '"' ); + header('Content-Disposition: attachment; filename="' . $downloadFileName . '"'); + } else { + header('Content-Disposition: inline; filename="' . $downloadFileName . '"'); } - header( 'Content-Type: ' . $contentType ); + header('Content-Type: ' . $contentType); //if userAgent (BROWSER) is MSIE we need special headers to avoid MSIE behaivor. $userAgent = strtolower( $_SERVER['HTTP_USER_AGENT'] ); diff --git a/workflow/engine/classes/class.actionsByEmailCore.php b/workflow/engine/classes/class.actionsByEmailCore.php index e8f979aa3..05255c2f1 100644 --- a/workflow/engine/classes/class.actionsByEmailCore.php +++ b/workflow/engine/classes/class.actionsByEmailCore.php @@ -171,25 +171,25 @@ class actionsByEmailCoreClass extends PMPlugin $variables = $variableService->doGetVariables($caseFields['PRO_UID']); $field = new stdClass(); $field->label = ''; - $actionField = str_replace(array('@@','@#','@=','@%','@?','@$'), '', $configuration['ABE_ACTION_FIELD']); + $actionField = str_replace(array('@@', '@#', '@=', '@%', '@?', '@$'), '', $configuration['ABE_ACTION_FIELD']); G::LoadClass('pmDynaform'); $obj = new pmDynaform($configuration['DYN_UID']); $configuration['CURRENT_DYNAFORM'] = $configuration['DYN_UID']; $file = $obj->printPmDynaformAbe($configuration); $__ABE__ .= $file; - $__ABE__ .= '' . $field->label . '

'; + $__ABE__ .= '
' . $field->label . '
'; $index = 1; - $__ABE__.='
'; + $__ABE__ .= '
'; foreach ($customGrid as $key => $value) { - $__ABE__ .= '' . (($index % 5 == 0) ? '' : ' '); $index++; } - $__ABE__.='
' . $value['abe_custom_label']; $__ABE__ .= '

'; + $__ABE__ .= '
'; break; case 'LINK': $__ABE__ .= 'Please complete this form'; diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index 73d5fed81..e2da9d154 100644 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -4528,6 +4528,11 @@ class Cases /*----------------------------------********---------------------------------*/ $this->getExecuteTriggerProcess($sApplicationUID, 'REASSIGNED'); + + //Delete record of the table LIST_UNASSIGNED + $unassigned = new ListUnassigned(); + $unassigned->remove($sApplicationUID, $iDelegation); + return true; } diff --git a/workflow/engine/classes/class.library.php b/workflow/engine/classes/class.library.php deleted file mode 100644 index f83935f83..000000000 --- a/workflow/engine/classes/class.library.php +++ /dev/null @@ -1,43 +0,0 @@ -createStatement(); - - //Number of records active - $criteria = new Criteria("workflow"); - - //SELECT - $criteria->addSelectColumn(CaseConsolidatedCorePeer::CON_STATUS); - //FROM - //WHERE - $criteria->add(CaseConsolidatedCorePeer::CON_STATUS, "ACTIVE"); - - $activeNumRec = CaseConsolidatedCorePeer::doCount($criteria); - - //Number of records - $numRec = 0; - - $sql = "SELECT COUNT(APP_CACHE_VIEW.TAS_UID) AS NUMREC - FROM CASE_CONSOLIDATED - LEFT JOIN APP_CACHE_VIEW ON (CASE_CONSOLIDATED.TAS_UID = APP_CACHE_VIEW.TAS_UID) - WHERE APP_CACHE_VIEW.USR_UID = '$userUid' AND - APP_CACHE_VIEW.DEL_THREAD_STATUS = 'OPEN' AND - APP_CACHE_VIEW.APP_STATUS = 'TO_DO'"; - - $rsSql = $stmt->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); - - while ($rsSql->next()) { - $row = $rsSql->getRow(); - - $numRec = $row["NUMREC"]; - } - - $numRec = ($activeNumRec > 0)? $numRec : 0; - - return $numRec; - } -} - diff --git a/workflow/engine/classes/class.plugin.php b/workflow/engine/classes/class.plugin.php index b5d921d47..e4e5c0d6c 100644 --- a/workflow/engine/classes/class.plugin.php +++ b/workflow/engine/classes/class.plugin.php @@ -485,7 +485,8 @@ class PMPlugin $file = $path . "public_html/" . $extensionPath; @file_put_contents($file, "", LOCK_EX); foreach ($item->files as $name) { - @file_put_contents($file, file_get_contents($item->path . "/" . $name), FILE_APPEND | LOCK_EX); + $content = file_get_contents($item->path . "/" . $name) . "\n"; + @file_put_contents($file, $content, FILE_APPEND | LOCK_EX); } $this->registerDesignerSourcePath($extensionPath); } diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 125166c24..09413f3bb 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -27,6 +27,7 @@ class pmDynaform private $context = array(); private $dataSources = null; private $databaseProviders = null; + private $propertiesToExclude = array(); public function __construct($fields = array()) { @@ -37,6 +38,7 @@ class pmDynaform $this->serverConf = &serverConf::getSingleton(); $this->isRTL = ($this->serverConf->isRtl(SYS_LANG)) ? 'true' : 'false'; $this->fields = $fields; + $this->propertiesToExclude = array('dataVariable'); $this->getDynaform(); $this->getDynaforms(); $this->synchronizeSubDynaform(); @@ -196,11 +198,13 @@ class pmDynaform if (is_string($value) && in_array(substr($value, 0, 2), $prefixs)) { $triggerValue = substr($value, 2); if (isset($this->fields["APP_DATA"][$triggerValue])) { - if ($key !== "dataVariable") { + if (!in_array($key, $this->propertiesToExclude)) { $json->{$key} = $this->fields["APP_DATA"][$triggerValue]; } } else { - $json->{$key} = ""; + if (!in_array($key, $this->propertiesToExclude)) { + $json->{$key} = ""; + } } } //set properties from 'formInstance' variable @@ -1909,6 +1913,12 @@ class pmDynaform if ($validatorClass !== null) { $validatorClass->validatePost($post); } + //Clears the data in the appData for grids + if (array_key_exists($json->id, $this->fields) && $json->type === 'grid' && + !array_key_exists($json->id, $post) + ) { + $post[$json->variable] = array(array()); + } } }; $json = G::json_decode($this->record["DYN_CONTENT"]); diff --git a/workflow/engine/classes/class.pmFunctions.php b/workflow/engine/classes/class.pmFunctions.php index 8b31758aa..fe96690b2 100644 --- a/workflow/engine/classes/class.pmFunctions.php +++ b/workflow/engine/classes/class.pmFunctions.php @@ -527,13 +527,27 @@ function WSLogin ($user, $pass, $endpoint = "") function WSOpen ($force = false) { if (isset( $_SESSION["WS_SESSION_ID"] ) || $force) { + $optionsHeaders = array( + "cache_wsdl" => WSDL_CACHE_NONE, + "soap_version" => SOAP_1_1, + "trace" => 1, + "stream_context" => stream_context_create( + array( + 'ssl' => array( + 'verify_peer' => 0, + 'verify_peer_name' => 0 + ) + ) + ) + ); + if (! isset( $_SESSION["WS_END_POINT"] )) { - $defaultEndpoint = "http://" . $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . "/sys" . SYS_SYS . "/en/classic/services/wsdl2"; + $defaultEndpoint = $_SERVER["REQUEST_SCHEME"] . "://" . $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . "/sys" . SYS_SYS . "/en/classic/services/wsdl2"; } $endpoint = isset( $_SESSION["WS_END_POINT"] ) ? $_SESSION["WS_END_POINT"] : $defaultEndpoint; - $client = new SoapClient( $endpoint ); + $client = new SoapClient( $endpoint, $optionsHeaders); return $client; } else { diff --git a/workflow/engine/classes/class.processes.php b/workflow/engine/classes/class.processes.php index 6645fdfdd..dde6e8566 100644 --- a/workflow/engine/classes/class.processes.php +++ b/workflow/engine/classes/class.processes.php @@ -2507,6 +2507,7 @@ class Processes $data->processVariables[$key]['VAR_UID'] = $newGuid; } } + $data->uid["PROCESS_VARIABLES"] = $map; } } catch (Exception $e) { @@ -2610,6 +2611,9 @@ class Processes public function renewAll(&$oData) { $oData->uid = array(); + if (isset($oData->process["PRO_PARENT"]) && isset($oData->process["PRO_UID"])) { + $oData->uid["PROCESS"] = array($oData->process["PRO_PARENT"] => $oData->process["PRO_UID"]); + } $this->renewAllTaskGuid($oData); $this->renewAllDynaformGuid($oData); diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index c2f3c0691..793baea2b 100644 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -1401,6 +1401,10 @@ class workspaceTools $arrayRegExpEngineSearch = array("/\)\s*TYPE\s*=\s*(InnoDB)/i", "/\)\s*TYPE\s*=\s*(MyISAM)/i","/SET\s*FOREIGN_KEY_CHECKS\s*=\s*0\s*;/"); $arrayRegExpEngineReplace = array(") ENGINE=\\1 DEFAULT CHARSET=utf8", ") ENGINE=\\1","SET FOREIGN_KEY_CHECKS=0;\nSET unique_checks=0;\nSET AUTOCOMMIT=0;"); + //replace DEFINER + $script = preg_replace('/DEFINER=[^*]*/', '', file_get_contents($filename)); + file_put_contents($filename, $script); + if (!$flag && !is_null($flagFunction)) { //Replace TYPE by ENGINE if( $versionBackupEngine == 1) { diff --git a/workflow/engine/classes/model/AdditionalTables.php b/workflow/engine/classes/model/AdditionalTables.php index 91f90e755..3e44e519f 100644 --- a/workflow/engine/classes/model/AdditionalTables.php +++ b/workflow/engine/classes/model/AdditionalTables.php @@ -778,6 +778,10 @@ class AdditionalTables extends BaseAdditionalTables // quick fix // map all empty values as NULL for Database foreach ($caseData as $dKey => $dValue) { + if (is_array($dValue) && count($dValue)) { + $j = key($dValue); + $dValue = (is_array($dValue[$j])) ? $dValue : $dValue[$j]; + } if (!is_array($dValue)) { foreach ($fieldTypes as $key => $fieldType) { foreach ($fieldType as $name => $theType) { @@ -897,6 +901,10 @@ class AdditionalTables extends BaseAdditionalTables $caseData = unserialize($caseData); } foreach ($caseData as $i => $v) { + if (is_array($v) && count($v)) { + $j = key($v); + $v = (is_array($v[$j])) ? $v : $v[$j]; + } foreach ($fieldTypes as $key => $fieldType) { foreach ($fieldType as $name => $type) { if ( strtoupper ( $i) == $name) { diff --git a/workflow/engine/classes/model/AppDelegation.php b/workflow/engine/classes/model/AppDelegation.php index 21c1083fe..6c95d0e57 100644 --- a/workflow/engine/classes/model/AppDelegation.php +++ b/workflow/engine/classes/model/AppDelegation.php @@ -447,6 +447,7 @@ class AppDelegation extends BaseAppDelegation //Get Task properties $task = TaskPeer::retrieveByPK( $this->getTasUid() ); + $aData = array(); $aData['TAS_UID'] = $this->getTasUid(); //Added to allow User defined Timing Control at Run time from Derivation screen if (isset( $sNextTasParam['NEXT_TASK']['TAS_TRANSFER_HIDDEN_FLY'] ) && $sNextTasParam['NEXT_TASK']['TAS_TRANSFER_HIDDEN_FLY'] == 'true') { @@ -476,7 +477,7 @@ class AppDelegation extends BaseAppDelegation //Calendar - Use the dates class to calculate dates $calendar = new calendar(); - $arrayCalendarData = array(); + $arrayCalendarData = $calendar->getCalendarData($aCalendarUID); if ($calendar->pmCalendarUid == "") { $calendar->getCalendar(null, $this->getProUid(), $this->getTasUid()); @@ -485,11 +486,11 @@ class AppDelegation extends BaseAppDelegation } //Due date - /*$iDueDate = $calendar->calculateDate( $this->getDelDelegateDate(), $aData['TAS_DURATION'], $aData['TAS_TIMEUNIT'] //hours or days, ( we only accept this two types or maybe weeks - );*/ - $dueDate = $calendar->dashCalculateDate($this->getDelDelegateDate(), $aData["TAS_DURATION"], $aData["TAS_TIMEUNIT"], $arrayCalendarData); + $initDate = $this->getDelDelegateDate(); + $timeZone = \ProcessMaker\Util\DateTime::convertUtcToTimeZone($initDate); + $dueDate = $calendar->dashCalculateDate($timeZone, $aData["TAS_DURATION"], $aData["TAS_TIMEUNIT"], $arrayCalendarData); - //Return + $dueDate = \ProcessMaker\Util\DateTime::convertDataToUtc($dueDate); return $dueDate; } diff --git a/workflow/engine/classes/model/ProcessUser.php b/workflow/engine/classes/model/ProcessUser.php index b3596142e..5f72d9bad 100644 --- a/workflow/engine/classes/model/ProcessUser.php +++ b/workflow/engine/classes/model/ProcessUser.php @@ -97,21 +97,21 @@ class ProcessUser extends BaseProcessUser { try { $oCriteria = new Criteria(); - $oCriteria->add( ProcessUserPeer::PRO_UID, $proUid ); - $oCriteria->add( ProcessUserPeer::PU_TYPE, 'SUPERVISOR' ); - $oCriteria->add( ProcessUserPeer::USR_UID, $usrUid ); - $dataset = ProcessUserPeer::doSelectRS( $oCriteria ); - $dataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $oCriteria->add(ProcessUserPeer::PRO_UID, $proUid); + $oCriteria->add(ProcessUserPeer::PU_TYPE, 'SUPERVISOR'); + $oCriteria->add(ProcessUserPeer::USR_UID, $usrUid); + $dataset = ProcessUserPeer::doSelectRS($oCriteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); //If the user is in Assigned supervisors list - if($dataset->next()){ + if ($dataset->next()) { return true; } else { //If the user is in a group in Assigned supervisors list $oCriteria = new Criteria(); - $oCriteria->add( ProcessUserPeer::PRO_UID, $proUid ); - $oCriteria->add( ProcessUserPeer::PU_TYPE, 'GROUP_SUPERVISOR'); - $dataset = ProcessUserPeer::doSelectRS( $oCriteria ); - $dataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $oCriteria->add(ProcessUserPeer::PRO_UID, $proUid); + $oCriteria->add(ProcessUserPeer::PU_TYPE, 'GROUP_SUPERVISOR'); + $dataset = ProcessUserPeer::doSelectRS($oCriteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $oGroups = new Groups(); $aGroups = $oGroups->getActiveGroupsForAnUser($usrUid); while ($dataset->next()) { @@ -119,8 +119,6 @@ class ProcessUser extends BaseProcessUser $groupUid = $row['USR_UID']; if (in_array($groupUid, $aGroups)) { return true; - } else { - return false; } } return false; diff --git a/workflow/engine/classes/model/Task.php b/workflow/engine/classes/model/Task.php index 0d114daca..28110cc98 100644 --- a/workflow/engine/classes/model/Task.php +++ b/workflow/engine/classes/model/Task.php @@ -409,6 +409,7 @@ class Task extends BaseTask $this->setTasPosx(""); $this->setTasPosy(""); $this->setTasColor(""); + $this->setTasGroupVariable(""); $this->fromArray($aData,BasePeer::TYPE_FIELDNAME); if ($this->validate()) { diff --git a/workflow/engine/js/cases/core/pmDynaform.js b/workflow/engine/js/cases/core/pmDynaform.js index 57976b621..6b7687e41 100644 --- a/workflow/engine/js/cases/core/pmDynaform.js +++ b/workflow/engine/js/cases/core/pmDynaform.js @@ -82,6 +82,7 @@ $(window).load(function () { data: data, delIndex: window.delIndex ? window.delIndex : delIndexDefault, dynaformUid: dyn_uid, + isRTL: window.isRTL, onBeforePrintHandler : function () { var nodeClone = $(".pmdynaform-container").clone(); nodeClone.addClass("printing-form"); diff --git a/workflow/engine/methods/cases/caseHistory_Ajax.php b/workflow/engine/methods/cases/caseHistory_Ajax.php index 1638b9601..feded6eff 100644 --- a/workflow/engine/methods/cases/caseHistory_Ajax.php +++ b/workflow/engine/methods/cases/caseHistory_Ajax.php @@ -26,32 +26,38 @@ $actionAjax = isset( $_REQUEST['actionAjax'] ) ? $_REQUEST['actionAjax'] : null; if ($actionAjax == 'historyGridList_JXP') { - G::LoadClass( 'case' ); - G::LoadClass( "BasePeer" ); + G::LoadClass('case'); + G::LoadClass("BasePeer"); global $G_PUBLISH; - $c = Cases::getTransferHistoryCriteria( $_SESSION['APPLICATION'] ); + $criteria = Cases::getTransferHistoryCriteria($_SESSION['APPLICATION']); + $rs = GulliverBasePeer::doSelectRs($criteria); + $totalCount = $rs->getRecordCount(); + + $start = $_REQUEST["start"]; + $limit = $_REQUEST["limit"]; + + $criteria->setLimit($limit); + $criteria->setOffset($start); + + $rs = GulliverBasePeer::doSelectRs($criteria); + $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); $result = new stdClass(); - $aProcesses = Array (); - - $rs = GulliverBasePeer::doSelectRs( $c ); - $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC ); - $rs->next(); - for ($j = 0; $j < $rs->getRecordCount(); $j ++) { + $aProcesses = Array(); + while ($rs->next()) { $result = $rs->getRow(); $result["ID_HISTORY"] = $result["PRO_UID"] . '_' . $result["APP_UID"] . '_' . $result["TAS_UID"]; $aProcesses[] = $result; - $rs->next(); } $newDir = '/tmp/test/directory'; - G::verifyPath( $newDir ); + G::verifyPath($newDir); $r = new stdclass(); $r->data = \ProcessMaker\Util\DateTime::convertUtcToTimeZone($aProcesses); - $r->totalCount = 2; + $r->totalCount = $totalCount; - echo G::json_encode( $r ); + echo G::json_encode($r); } if ($actionAjax == 'historyGridListChangeLogPanelBody_JXP') { diff --git a/workflow/engine/methods/cases/caseMessageHistory_Ajax.php b/workflow/engine/methods/cases/caseMessageHistory_Ajax.php index 5a466f1e0..7bddbc5f3 100644 --- a/workflow/engine/methods/cases/caseMessageHistory_Ajax.php +++ b/workflow/engine/methods/cases/caseMessageHistory_Ajax.php @@ -93,6 +93,7 @@ if ($actionAjax == 'messageHistoryGridList_JXP') { } } + $totalCount = 0; foreach ($appMessageArray as $index => $value) { if (($appMessageArray[$index]['APP_MSG_SHOW_MESSAGE'] == 1 && $respMess != 'BLOCK' ) && ($appMessageArray[$index]['DEL_INDEX'] == 0 || in_array($appMessageArray[$index]['DEL_INDEX'], $delIndex ))) { @@ -104,12 +105,6 @@ if ($actionAjax == 'messageHistoryGridList_JXP') { $appMessageArray[$index]['APP_MSG_BODY'] = str_replace('\"','"',$appMessageArray[$index]['APP_MSG_BODY']); $appMessageArray[$index]['APP_MSG_BODY'] = str_replace('"','\"',$appMessageArray[$index]['APP_MSG_BODY']); $aProcesses[] = array_merge($appMessageArray[$index], array('MSGS_HISTORY' => $respMess)); - } - } - - $totalCount = 0; - foreach ($appMessageCountArray as $index => $value) { - if ($appMessageCountArray[$index]['APP_MSG_SHOW_MESSAGE'] == 1) { $totalCount ++; } } @@ -127,9 +122,11 @@ if ($actionAjax == 'messageHistoryGridList_JXP') { $r->data[0] = array('APP_MSG_TYPE' => ''); } - $r->data[0]["APP_MSG_TYPE"] = (array_key_exists($r->data[0]["APP_MSG_TYPE"], $arrayToTranslation)) ? - $arrayToTranslation[$r->data[0]["APP_MSG_TYPE"]] : - $r->data[0]["APP_MSG_TYPE"]; + foreach ($r->data as $key => $value) { + $r->data[$key]["APP_MSG_TYPE"] = array_key_exists($r->data[$key]["APP_MSG_TYPE"], $arrayToTranslation) ? + $arrayToTranslation[$r->data[$key]["APP_MSG_TYPE"]] : + $r->data[$key]["APP_MSG_TYPE"]; + } } echo G::json_encode( $r ); diff --git a/workflow/engine/methods/cases/casesConsolidatedListExtJs.php b/workflow/engine/methods/cases/casesConsolidatedListExtJs.php index 2305e6256..17260c863 100644 --- a/workflow/engine/methods/cases/casesConsolidatedListExtJs.php +++ b/workflow/engine/methods/cases/casesConsolidatedListExtJs.php @@ -1,111 +1,68 @@ addSelectColumn(CaseConsolidatedCorePeer::CON_STATUS); -$oCriteria->add(CaseConsolidatedCorePeer::CON_STATUS, "ACTIVE"); +$oCriteria->add(CaseConsolidatedCorePeer::CON_STATUS, 'ACTIVE'); $activeNumRows = CaseConsolidatedCorePeer::doCount($oCriteria); -G::LoadClass ("BasePeer"); -G::LoadClass ("configuration"); +G::LoadClass("BasePeer"); +G::LoadClass("configuration"); G::loadClass("pmFunctions"); $headPublisher = &headPublisher::getSingleton(); - -//cambiar esto por PROPEL //CASE_CONSOLIDATED TASK $usrUid = $_SESSION["USER_LOGGED"]; - -$oCriteria = new Criteria("workflow"); -$oCriteria->addSelectColumn("*"); -$oCriteria->addSelectColumn(CaseConsolidatedCorePeer::TAS_UID); -$oCriteria->addSelectColumn(TaskPeer::TAS_TITLE); -$oCriteria->addJoin(CaseConsolidatedCorePeer::TAS_UID,TaskPeer::TAS_UID, Criteria::LEFT_JOIN); - -$params = array(); //This will be filled with the parameters -$sql = BasePeer::createSelectSql($oCriteria, $params); - -$oDataset = CaseConsolidatedCorePeer::doSelectRS($oCriteria); -$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); -//$oDataset->next(); -while ($oDataset->next()) { - $aRow = $oDataset->getRow(); - //$aTaskConsolidated [] = $aRow; -} - -$query = "SELECT * - FROM CASE_CONSOLIDATED LEFT JOIN CONTENT ON - (CASE_CONSOLIDATED.TAS_UID = CONTENT.CON_ID) LEFT JOIN TASK ON (CASE_CONSOLIDATED.TAS_UID = TASK.TAS_UID) - WHERE CONTENT.CON_CATEGORY='TAS_TITLE' AND CONTENT.CON_LANG='en'"; -$aTaskConsolidated = executeQuery($query); - $conf = new Configurations(); try { - $confCasesList = $conf->getConfiguration("casesList", $action); + $confCasesList = $conf->getConfiguration("casesList", $action); $generalConfCasesList = $conf->getConfiguration("ENVIRONMENT_SETTINGS", ""); } catch (Exception $e) { $confCasesList = array(); $generalConfCasesList = array(); } -$config = getAdditionalFields($action, $confCasesList); - if (isset($generalConfCasesList["casesListRowNumber"]) && !empty($generalConfCasesList["casesListRowNumber"])) { $pageSize = intval($generalConfCasesList["casesListRowNumber"]); } else { + $config = getAdditionalFields($action, $confCasesList); $pageSize = intval($config["rowsperpage"]); } -$arrayTabItem = array(); -$aAllData = array(); -//$aQTY = array(); -$i = 0; - -//SQL -$cnn = Propel::getConnection("workflow"); -$stmt = $cnn->createStatement(); - -//foreach ($aTaskConsolidated as $value) -//{ -$i++; - -$sql = "SELECT COUNT(APP_CACHE_VIEW.TAS_UID) AS NUMREC, - APP_CACHE_VIEW.PRO_UID, - (SELECT CON.CON_VALUE - FROM CONTENT AS CON - WHERE CON.CON_ID = APP_CACHE_VIEW.PRO_UID AND CON.CON_CATEGORY = 'PRO_TITLE' AND CON.CON_LANG = '" . SYS_LANG . "' - ) AS PROCESS_TITLE, - APP_CACHE_VIEW.TAS_UID, - CONTASK.CON_VALUE AS TASK_TITLE, - CASE_CONSOLIDATED.DYN_UID - FROM CASE_CONSOLIDATED - LEFT JOIN CONTENT AS CONTASK ON (CASE_CONSOLIDATED.TAS_UID = CONTASK.CON_ID AND CONTASK.CON_CATEGORY = 'TAS_TITLE' AND CONTASK.CON_LANG = '" . SYS_LANG . "') - LEFT JOIN APP_CACHE_VIEW ON (CASE_CONSOLIDATED.TAS_UID = APP_CACHE_VIEW.TAS_UID) - WHERE APP_CACHE_VIEW.USR_UID = '$usrUid' AND - APP_CACHE_VIEW.DEL_THREAD_STATUS = 'OPEN' AND - APP_CACHE_VIEW.APP_STATUS = 'TO_DO' - GROUP BY APP_CACHE_VIEW.TAS_UID"; - -$rsSql = $stmt->executeQuery($sql, ResultSet::FETCHMODE_ASSOC); +$criteria = new Criteria(); +$criteria->addAsColumn('NUMREC', 'COUNT(' . ListInboxPeer::TAS_UID . ')'); +$criteria->addSelectColumn(ListInboxPeer::PRO_UID); +$criteria->addSelectColumn(ProcessPeer::PRO_TITLE); +$criteria->addSelectColumn(ListInboxPeer::TAS_UID); +$criteria->addSelectColumn(TaskPeer::TAS_TITLE); +$criteria->addSelectColumn(CaseConsolidatedCorePeer::DYN_UID); +$criteria->addJoin(CaseConsolidatedCorePeer::TAS_UID, ListInboxPeer::TAS_UID, Criteria::LEFT_JOIN); +$criteria->addJoin(ListInboxPeer::PRO_UID, ProcessPeer::PRO_UID, Criteria::LEFT_JOIN); +$criteria->addJoin(ListInboxPeer::TAS_UID, TaskPeer::TAS_UID, Criteria::LEFT_JOIN); +$criteria->add(ListInboxPeer::USR_UID, $usrUid, Criteria::EQUAL); +$criteria->add(ListInboxPeer::APP_STATUS, 'TO_DO', Criteria::EQUAL); +$criteria->addGroupByColumn(ListInboxPeer::TAS_UID); +$rsSql = CaseConsolidatedCorePeer::doSelectRS($criteria); +$rsSql->setFetchmode(ResultSet::FETCHMODE_ASSOC); while ($rsSql->next()) { $row = $rsSql->getRow(); - $processUid = $row["PRO_UID"]; - $proTitle = $row["PROCESS_TITLE"]; - $taskUid = $row["TAS_UID"]; - $taskTitle = $row["TASK_TITLE"]; - $dynaformUid = $row["DYN_UID"]; + $processUid = $row['PRO_UID']; + $proTitle = $row['PRO_TITLE']; + $taskUid = $row['TAS_UID']; + $taskTitle = $row['TAS_TITLE']; + $dynaformUid = $row['DYN_UID']; - $tabTitle = $taskTitle . " (" . (($activeNumRows > 0)? $row["NUMREC"] : 0) . ")"; + $tabTitle = $taskTitle . " (" . (($activeNumRows > 0) ? $row["NUMREC"] : 0) . ")"; $grdTitle = htmlentities($proTitle . " / " . $tabTitle, ENT_QUOTES, "UTF-8"); - $tabTitle = htmlentities(substr($proTitle, 0, 25) . ((strlen($proTitle) > 25)? "..." : null) . " / " . $tabTitle, ENT_QUOTES, "UTF-8"); + $tabTitle = htmlentities(substr($proTitle, 0, 25) . ((strlen($proTitle) > 25) ? "..." : null) . " / " . $tabTitle, ENT_QUOTES, "UTF-8"); $oProcess = new Process(); - $isBpmn = $oProcess->isBpmnProcess($processUid); - if($isBpmn){ + $isBpmn = $oProcess->isBpmnProcess($processUid); + if ($isBpmn) { $arrayTabItem[] = " { title: \"$tabTitle\", @@ -116,7 +73,7 @@ while ($rsSql->next()) { } } }"; - }else{ + } else { $arrayTabItem[] = " { title: \"$tabTitle\", @@ -188,30 +145,20 @@ if (count($arrayTabItem) > 0) { echo "" . G::LoadTranslation("ID_NO_RECORDS_FOUND") . ""; } - - function getProcessArray($action, $userUid) { $processes = array(); $processes[] = array("", G::LoadTranslation("ID_ALL_PROCESS")); - + $cProcess = new Criteria("workflow"); switch ($action) { case "simple_search": case "search": //In search action, the query to obtain all process is too slow, so we need to query directly to //process and content tables, and for that reason we need the current language in AppCacheView. - G::loadClass("configuration"); - $oConf = new Configurations; - $oConf->loadConfig($x, "APP_CACHE_VIEW_ENGINE", "", "", "", ""); - $appCacheViewEngine = $oConf->aConfig; - $lang = isset($appCacheViewEngine["LANG"])? $appCacheViewEngine["LANG"] : "en"; - - $cProcess = new Criteria("workflow"); $cProcess->clearSelectColumns(); $cProcess->addSelectColumn(ProcessPeer::PRO_UID); $cProcess->addSelectColumn(ProcessPeer::PRO_TITLE); - $del = DBAdapter::getStringDelimiter(); $cProcess->add(ProcessPeer::PRO_STATUS, "ACTIVE"); $oDataset = ProcessPeer::doSelectRS($cProcess); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); @@ -226,21 +173,19 @@ function getProcessArray($action, $userUid) break; case "consolidated": default: - $oAppCache = new AppCacheView(); - $cProcess = $oAppCache->getToDoListCriteria($userUid); //fast enough break; } $cProcess->clearSelectColumns(); $cProcess->setDistinct(); - $cProcess->addSelectColumn(AppCacheViewPeer::PRO_UID); - $cProcess->addSelectColumn(AppCacheViewPeer::APP_PRO_TITLE); - $oDataset = AppCacheViewPeer::doSelectRS($cProcess); + $cProcess->addSelectColumn(ProcessPeer::PRO_UID); + $cProcess->addSelectColumn(ProcessPeer::PRO_TITLE); + $oDataset = ProcessPeer::doSelectRS($cProcess); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $oDataset->next(); while ($aRow = $oDataset->getRow()) { - $processes[] = array($aRow["PRO_UID"], $aRow["APP_PRO_TITLE"]); + $processes[] = array($aRow["PRO_UID"], $aRow["PRO_TITLE"]); $oDataset->next(); } diff --git a/workflow/engine/methods/cases/casesList_Ajax.php b/workflow/engine/methods/cases/casesList_Ajax.php index 5f4fc39c4..2bc115ff6 100644 --- a/workflow/engine/methods/cases/casesList_Ajax.php +++ b/workflow/engine/methods/cases/casesList_Ajax.php @@ -54,6 +54,30 @@ if ($actionAjax == "userValues") { $users = filterUserListArray($users, $query); //now get users, just for the Search action switch ($action) { + case 'to_reassign': + $cUsers = $oAppCache->getToReassignListCriteria(null); + $cUsers->addSelectColumn(AppCacheViewPeer::USR_UID); + + if (g::MySQLSintaxis()) { + $cUsers->addGroupByColumn(AppCacheViewPeer::USR_UID); + } + + if (!is_null($query)) { + $filters = $cUsers->getNewCriterion(UsersPeer::USR_FIRSTNAME, '%' . $query . '%', Criteria::LIKE)->addOr( + $cUsers->getNewCriterion(UsersPeer::USR_LASTNAME, '%' . $query . '%', Criteria::LIKE)->addOr( + $cUsers->getNewCriterion(UsersPeer::USR_USERNAME, '%' . $query . '%', Criteria::LIKE))); + $cUsers->addAnd($filters); + } + $cUsers->setLimit(20); + $cUsers->addAscendingOrderByColumn(AppCacheViewPeer::APP_CURRENT_USER); + $oDataset = AppCacheViewPeer::doSelectRS($cUsers, Propel::getDbConnection('workflow_ro')); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $users[] = array("USR_UID" => $aRow['USR_UID'], "USR_FULLNAME" => $aRow['APP_CURRENT_USER']); + $oDataset->next(); + } + break; case 'search_simple': case 'search': G::LoadClass("configuration"); diff --git a/workflow/engine/methods/cases/cases_Ajax.php b/workflow/engine/methods/cases/cases_Ajax.php index a90b02548..2fc375013 100644 --- a/workflow/engine/methods/cases/cases_Ajax.php +++ b/workflow/engine/methods/cases/cases_Ajax.php @@ -548,46 +548,49 @@ switch (($_POST['action']) ? $_POST['action'] : $_REQUEST['action']) { G::RenderPage( 'publish', 'raw' ); break; case 'uploadDocumentGrid_Ajax': - G::LoadClass( 'case' ); - G::LoadClass( "BasePeer" ); + G::LoadClass('case'); + G::LoadClass("BasePeer"); global $G_PUBLISH; $arrayToTranslation = array( - "INPUT" => G::LoadTranslation("ID_INPUT_DB"), - "OUTPUT" => G::LoadTranslation("ID_OUTPUT_DB"), + "INPUT" => G::LoadTranslation("ID_INPUT_DB"), + "OUTPUT" => G::LoadTranslation("ID_OUTPUT_DB"), "ATTACHED" => G::LoadTranslation("ID_ATTACHED_DB") ); $oCase = new Cases(); - $aProcesses = Array (); + $aProcesses = Array(); $G_PUBLISH = new Publisher(); - $c = $oCase->getAllUploadedDocumentsCriteria( $_SESSION['PROCESS'], $_SESSION['APPLICATION'], - $_SESSION['CURRENT_TASK'], $_SESSION['USER_LOGGED'], $_SESSION['INDEX']); - - if ($c->getDbName() == 'dbarray') { - $rs = ArrayBasePeer::doSelectRs( $c ); + $criteria = $oCase->getAllUploadedDocumentsCriteria($_SESSION['PROCESS'], $_SESSION['APPLICATION'], $_SESSION['CURRENT_TASK'], $_SESSION['USER_LOGGED'], $_SESSION['INDEX']); + if ($criteria->getDbName() == 'dbarray') { + $rs = ArrayBasePeer::doSelectRs($criteria); } else { - $rs = GulliverBasePeer::doSelectRs( $c ); + $rs = GulliverBasePeer::doSelectRs($criteria); } + $totalCount = $rs->getRecordCount(); - $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC ); - $rs->next(); + $start = $_REQUEST["start"]; + $limit = $_REQUEST["limit"]; - $totalCount = 0; - - for ($j = 0; $j < $rs->getRecordCount(); $j ++) { + $criteria->setLimit($limit); + $criteria->setOffset($start); + if ($criteria->getDbName() == 'dbarray') { + $rs = ArrayBasePeer::doSelectRs($criteria); + } else { + $rs = GulliverBasePeer::doSelectRs($criteria); + } + $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); + while ($rs->next()) { $result = $rs->getRow(); - $result["TYPE"] = (array_key_exists($result["TYPE"], $arrayToTranslation))? $arrayToTranslation[$result["TYPE"]] : $result["TYPE"]; + $result["TYPE"] = (array_key_exists($result["TYPE"], $arrayToTranslation)) ? $arrayToTranslation[$result["TYPE"]] : $result["TYPE"]; $aProcesses[] = $result; - $rs->next(); - $totalCount ++; } $r = new stdclass(); $r->data = $aProcesses; $r->totalCount = $totalCount; - echo Bootstrap::json_encode( $r ); + echo Bootstrap::json_encode($r); break; case 'generateDocumentGrid_Ajax': diff --git a/workflow/engine/methods/cases/cases_Resume.php b/workflow/engine/methods/cases/cases_Resume.php index b38f7c178..883dc3a0b 100644 --- a/workflow/engine/methods/cases/cases_Resume.php +++ b/workflow/engine/methods/cases/cases_Resume.php @@ -56,12 +56,13 @@ if (isset($_SESSION['ACTION']) && ($_SESSION['ACTION'] == 'jump')) { $Fields = $oCase->loadCase( $_SESSION['APPLICATION'], $_SESSION['INDEX']); } +//Check the participated $participated = $oCase->userParticipatedInCase( $_GET['APP_UID'], $_SESSION['USER_LOGGED'] ); +//Check if is Supervisor +$processUser = new ProcessUser(); +$userAccess = $processUser->validateUserAccess($Fields['PRO_UID'], $_SESSION['USER_LOGGED']); -if ($RBAC->userCanAccess( 'PM_ALLCASES' ) < 0 && $participated == 0) { - /*if (strtoupper($Fields['APP_STATUS']) != 'COMPLETED') { - $oCase->thisIsTheCurrentUser($_SESSION['APPLICATION'], $_SESSION['INDEX'], $_SESSION['USER_LOGGED'], 'SHOW_MESSAGE'); - }*/ +if ($RBAC->userCanAccess( 'PM_ALLCASES' ) < 0 && !$participated && !$userAccess) { $aMessage['MESSAGE'] = G::LoadTranslation( 'ID_NO_PERMISSION_NO_PARTICIPATED' ); $G_PUBLISH = new Publisher(); $G_PUBLISH->AddContent( 'xmlform', 'xmlform', 'login/showMessage', '', $aMessage ); @@ -77,12 +78,10 @@ if (isset( $aRow['APP_TYPE'] )) { $Fields['STATUS'] = ucfirst( strtolower( G::LoadTranslation( 'ID_CANCELLED' ) ) ); break; } - - //$Fields['STATUS'] = $aRow['APP_TYPE']; } $actions = 'false'; -if ($_GET['action'] == 'paused') { +if (isset($_GET['action']) && $_GET['action'] == 'paused') { $actions = 'true'; } diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 7bb4caf2d..bd2160239 100644 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -1009,7 +1009,7 @@ try { $aFields['TASK'][$sKey]['NEXT_TASK']['TAS_TRANSFER_HIDDEN_FLY'] = ""; if ($aValues['NEXT_TASK']['TAS_TRANSFER_FLY'] == 'true') { $aFields['TASK'][$sKey]['NEXT_TASK']['TAS_DURATION'] = ''; - $hoursSelected = $daysSelected = ''; + $hoursSelected = $daysSelected = $minSelected = ''; if ($aFields['TASK'][$sKey]['NEXT_TASK']['TAS_TIMEUNIT'] == 'HOURS') { $hoursSelected = "selected = 'selected'"; } else { diff --git a/workflow/engine/methods/setup/language_Ajax.php b/workflow/engine/methods/setup/language_Ajax.php index 040098840..820c94b1c 100644 --- a/workflow/engine/methods/setup/language_Ajax.php +++ b/workflow/engine/methods/setup/language_Ajax.php @@ -26,7 +26,7 @@ try { G::LoadSystem('inputfilter'); $filter = new InputFilter(); $_POST = $filter->xssFilterHard($_POST); - + G::LoadInclude( 'ajax' ); if (isset( $_POST['form'] )) { $_POST = $_POST['form']; @@ -153,7 +153,6 @@ try { $oDataset->next(); $aRow = $oDataset->getRow(); - $oContent = new Content(); if($locale != "en"){ //Default Lengage 'en' if($locale != SYS_LANG){ //Current lenguage //THERE IS NO ANY CASE STARTED FROM THES LANGUAGE diff --git a/workflow/engine/skinEngine/base/css/pmos-xtheme-gray.css b/workflow/engine/skinEngine/base/css/pmos-xtheme-gray.css index 9587833c2..87b8593e3 100644 --- a/workflow/engine/skinEngine/base/css/pmos-xtheme-gray.css +++ b/workflow/engine/skinEngine/base/css/pmos-xtheme-gray.css @@ -363,10 +363,9 @@ button.x-btn-text:focus,.x-combo-selected{ /* -Pone en mayúsuclas el texto que se encuentra en el toolbar de arriba +toolbar, set 'text-transform: capitalize;' for capitalize (transforms the first character of each word to uppercase) */ .x-panel-tbar .x-toolbar-cell{ - text-transform: capitalize; } /*TREE*/ @@ -911,7 +910,8 @@ antes funcionaba. top: 40%; left: 40%; font-size: 15px; - color:black filter:progid:DXImageTransform.Microsoft.Alpha(opacity=80); + color:black; + filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=80)"; opacity: .55; -moz-opacity: .55; } diff --git a/workflow/engine/skinEngine/neoclassic/css/pmos-xtheme-gray.css b/workflow/engine/skinEngine/neoclassic/css/pmos-xtheme-gray.css index 2f2486d85..388e22e4f 100644 --- a/workflow/engine/skinEngine/neoclassic/css/pmos-xtheme-gray.css +++ b/workflow/engine/skinEngine/neoclassic/css/pmos-xtheme-gray.css @@ -523,10 +523,9 @@ button.x-btn-text:focus, padding-left: 18px !important; } /* -Pone en mayC:suclas el texto que se encuentra en el toolbar de arriba +toolbar, set 'text-transform: capitalize;' for capitalize (transforms the first character of each word to uppercase) */ .x-panel-tbar .x-toolbar-cell { - text-transform: capitalize; } /*TREE*/ #ext-gen38.x-tree-root-ct .x-tree-node-el { diff --git a/workflow/engine/skinEngine/uxmodern/css/pmos-xtheme-gray.css b/workflow/engine/skinEngine/uxmodern/css/pmos-xtheme-gray.css index cad3501a0..ea0c5ab9a 100644 --- a/workflow/engine/skinEngine/uxmodern/css/pmos-xtheme-gray.css +++ b/workflow/engine/skinEngine/uxmodern/css/pmos-xtheme-gray.css @@ -388,10 +388,9 @@ button.x-btn-text:focus,.x-combo-selected{ /* -Pone en mayúsuclas el texto que se encuentra en el toolbar de arriba +toolbar, set 'text-transform: capitalize;' for capitalize (transforms the first character of each word to uppercase) */ .x-panel-tbar .x-toolbar-cell{ - text-transform: capitalize; } /*TREE*/ @@ -930,7 +929,8 @@ antes funcionaba. top: 40%; left: 40%; font-size: 15px; - color:black filter:progid:DXImageTransform.Microsoft.Alpha(opacity=80); + color:black; + filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=80)"; opacity: .55; -moz-opacity: .55; } diff --git a/workflow/engine/skinEngine/uxs/css/pmos-xtheme-gray.css b/workflow/engine/skinEngine/uxs/css/pmos-xtheme-gray.css index 3fe3a2fee..a3ec295bd 100644 --- a/workflow/engine/skinEngine/uxs/css/pmos-xtheme-gray.css +++ b/workflow/engine/skinEngine/uxs/css/pmos-xtheme-gray.css @@ -360,10 +360,9 @@ button.x-btn-text:focus,.x-combo-selected{ /* -Pone en mayúsuclas el texto que se encuentra en el toolbar de arriba +toolbar, set 'text-transform: capitalize;' for capitalize (transforms the first character of each word to uppercase) */ .x-panel-tbar .x-toolbar-cell{ - text-transform: capitalize; } /*TREE*/ @@ -891,7 +890,8 @@ antes funcionaba. top: 40%; left: 40%; font-size: 15px; - color:black filter:progid:DXImageTransform.Microsoft.Alpha(opacity=80); + color:black; + filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=80)"; opacity: .55; -moz-opacity: .55; } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 4a4b60bde..55081fc76 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -12,6 +12,7 @@ use \CasesPeer; class Cases { private $formatFieldNameInUppercase = true; + private $messageResponse = []; /** * Set the format of the fields name (uppercase, lowercase) @@ -2878,6 +2879,7 @@ class Cases * * return json Return an json with the result of the reassigned cases. */ + public function doPostReassign($data) { if (!is_array($data)) { @@ -2888,112 +2890,125 @@ class Cases return; } } - $dataResponse = $data; - - //Verify data - $arrayCasesToReassign = $data['cases']; - - $arrayMsg = []; - - foreach ($arrayCasesToReassign as $key => $value) { - $appDelegation = \AppDelegationPeer::retrieveByPK($value['APP_UID'], $value['DEL_INDEX']); - - if (is_null($appDelegation)) { - $arrayMsg[] = [ - 'app_uid' => $value['APP_UID'], - 'del_index' => $value['DEL_INDEX'], - 'result' => 0, - 'status' => 'DELEGATION_NOT_EXISTS' - ]; - } - } - - if (!empty($arrayMsg)) { - return ['cases' => $arrayMsg]; - } - - $task = new \ProcessMaker\BusinessModel\Task(); - $supervisor = new \ProcessMaker\BusinessModel\ProcessSupervisor(); - - $userUid = $data['usr_uid_target']; - - foreach ($arrayCasesToReassign as $value) { - $appDelegation = \AppDelegationPeer::retrieveByPK($value['APP_UID'], $value['DEL_INDEX']); - - //Verify data - $taskUid = $appDelegation->getTasUid(); - - $flagBoolean = $task->checkUserOrGroupAssignedTask($taskUid, $userUid); - $flagps = $supervisor->isUserProcessSupervisor($appDelegation->getProUid(), $userUid); - - if (!$flagBoolean && !$flagps) { - $arrayMsg[] = [ - 'app_uid' => $value['APP_UID'], - 'del_index' => $value['DEL_INDEX'], - 'result' => 0, - 'status' => 'USER_NOT_ASSIGNED_TO_TASK' - ]; - } - } - - if (!empty($arrayMsg)) { - return ['cases' => $arrayMsg]; - } - - G::LoadClass('case'); - $oCases = new \Cases(); - $appDelegation = new \AppDelegation(); $casesToReassign = $data['cases']; - $result = 0; - if (sizeof($casesToReassign)) { - foreach ($casesToReassign as $key => $val) { - $usrUid = ''; - if (array_key_exists('USR_UID', $val)) { - if ($val['USR_UID'] != '') { - $usrUid = $val['USR_UID']; + $oCases = new \Cases(); + foreach ($casesToReassign as $key => $val) { + $appDelegation = \AppDelegationPeer::retrieveByPK($val['APP_UID'], $val['DEL_INDEX']); + $existDelegation = $this->validateReassignData($appDelegation, $val, $data, 'DELEGATION_NOT_EXISTS'); + if ($existDelegation) { + $existDelegation = $this->validateReassignData($appDelegation, $val, $data, 'USER_NOT_ASSIGNED_TO_TASK'); + if ($existDelegation) { + $usrUid = ''; + if (array_key_exists('USR_UID', $val)) { + if ($val['USR_UID'] != '') { + $usrUid = $val['USR_UID']; + } + } + if ($usrUid == '') { + $fields = $appDelegation->toArray(\BasePeer::TYPE_FIELDNAME); + $usrUid = $fields['USR_UID']; + } + //Will be not able reassign a case when is paused + $flagPaused = $this->validateReassignData($appDelegation, $val, $data, 'ID_REASSIGNMENT_PAUSED_ERROR'); + //Current users of OPEN DEL_INDEX thread + $flagSameUser = $this->validateReassignData($appDelegation, $val, $data, 'REASSIGNMENT_TO_THE_SAME_USER'); + //reassign case + if ($flagPaused && $flagSameUser) { + $reassigned = $oCases->reassignCase($val['APP_UID'], $val['DEL_INDEX'], $usrUid, $data['usr_uid_target']); + $result = $reassigned ? 1 : 0; + $this->messageResponse = [ + 'APP_UID' => $val['APP_UID'], + 'DEL_INDEX' => $val['DEL_INDEX'], + 'RESULT' => $result, + 'STATUS' => 'SUCCESS' + ]; } } + } + $dataResponse['cases'][$key] = $this->messageResponse; + } + unset($dataResponse['usr_uid_target']); + return G::json_encode($dataResponse); + } - if ($usrUid == '') { - $fields = $appDelegation->load($val['APP_UID'], $val['DEL_INDEX']); - $usrUid = $fields['USR_UID']; - } - //Will be not able reassign a case when is paused - $flagReassign = true; - if (\AppDelay::isPaused($val['APP_UID'], $val['DEL_INDEX'])) { - $dataResponse['cases'][$key]['result'] = 0; - $dataResponse['cases'][$key]['status'] = \G::LoadTranslation('ID_REASSIGNMENT_PAUSED_ERROR'); - $flagReassign = false; + /** + * @param $appDelegation + * @param $value + * @param $data + * @param string $type + * @return bool + */ + private function validateReassignData($appDelegation, $value, $data, $type = 'DELEGATION_NOT_EXISTS') + { + $return = true; + switch ($type) { + case 'DELEGATION_NOT_EXISTS': + if (is_null($appDelegation)) { + $this->messageResponse = [ + 'APP_UID' => $value['APP_UID'], + 'DEL_INDEX' => $value['DEL_INDEX'], + 'RESULT' => 0, + 'STATUS' => $type + ]; + $return = false; } + break; + case 'USER_NOT_ASSIGNED_TO_TASK': + $task = new \ProcessMaker\BusinessModel\Task(); + $supervisor = new \ProcessMaker\BusinessModel\ProcessSupervisor(); + $taskUid = $appDelegation->getTasUid(); + $flagBoolean = $task->checkUserOrGroupAssignedTask($taskUid, $data['usr_uid_target']); + $flagps = $supervisor->isUserProcessSupervisor($appDelegation->getProUid(), $data['usr_uid_target']); - //Current users of OPEN DEL_INDEX thread - $aCurUser = $appDelegation->getCurrentUsers($val['APP_UID'], $val['DEL_INDEX']); + if (!$flagBoolean && !$flagps) { + $this->messageResponse = [ + 'APP_UID' => $value['APP_UID'], + 'DEL_INDEX' => $value['DEL_INDEX'], + 'RESULT' => 0, + 'STATUS' => 'USER_NOT_ASSIGNED_TO_TASK' + ]; + $return = false; + } + break; + case 'ID_REASSIGNMENT_PAUSED_ERROR': + if (\AppDelay::isPaused($value['APP_UID'], $value['DEL_INDEX'])) { + $this->messageResponse = [ + 'APP_UID' => $value['APP_UID'], + 'DEL_INDEX' => $value['DEL_INDEX'], + 'RESULT' => 0, + 'STATUS' => \G::LoadTranslation('ID_REASSIGNMENT_PAUSED_ERROR') + ]; + $return = false; + } + break; + case 'REASSIGNMENT_TO_THE_SAME_USER': + $aCurUser = $appDelegation->getCurrentUsers($value['APP_UID'], $value['DEL_INDEX']); if (!empty($aCurUser)) { - foreach ($aCurUser as $keyAux => $value) { - if ($value === $data['usr_uid_target']) { - $flagReassign = false; - $result = 1; + foreach ($aCurUser as $keyAux => $val) { + if ($val === $data['usr_uid_target']) { + $this->messageResponse = [ + 'APP_UID' => $value['APP_UID'], + 'DEL_INDEX' => $value['DEL_INDEX'], + 'RESULT' => 1, + 'STATUS' => 'SUCCESS' + ]; + $return = false; } } } else { //DEL_INDEX is CLOSED - $dataResponse['cases'][$key]['result'] = 0; - $dataResponse['cases'][$key]['status'] = \G::LoadTranslation('ID_REASSIGNMENT_ERROR'); - $flagReassign = false; + $this->messageResponse = [ + 'APP_UID' => $value['APP_UID'], + 'DEL_INDEX' => $value['DEL_INDEX'], + 'RESULT' => 0, + 'STATUS' => \G::LoadTranslation('ID_REASSIGNMENT_ERROR') + ]; + $return = false; } - - if ($flagReassign) { - $reassigned = $oCases->reassignCase($val['APP_UID'], $val['DEL_INDEX'], $usrUid, $data['usr_uid_target']); - $result = $reassigned ? 1 : 0; - $dataResponse['cases'][$key]['status'] = 'SUCCESS'; - } - $dataResponse['cases'][$key]['result'] = $result; - } + break; } - unset($dataResponse['usr_uid_target']); - - return G::json_encode($dataResponse); + return $return; } /** @@ -3018,11 +3033,11 @@ class Cases public function checkUserHasPermissionsOrSupervisor($userUid, $applicationUid, $dynaformUid) { + $arrayApplicationData = $this->getApplicationRecordByPk($applicationUid, [], false); + //Check whether the process supervisor + $supervisor = new \ProcessMaker\BusinessModel\ProcessSupervisor(); + $userAccess = $supervisor->isUserProcessSupervisor($arrayApplicationData['PRO_UID'], $userUid); if (!empty($dynaformUid)) { - $arrayApplicationData = $this->getApplicationRecordByPk($applicationUid, [], false); - //Check whether the process supervisor - $supervisor = new \ProcessMaker\BusinessModel\ProcessSupervisor(); - $userAccess = $supervisor->isUserProcessSupervisor($arrayApplicationData['PRO_UID'], $userUid); //Check if have objects assigned (Supervisor) $cases = new \Cases(); $resultDynaForm = $cases->getAllDynaformsStepsToRevise($applicationUid); @@ -3065,7 +3080,7 @@ class Cases } else { $arrayResult = $this->getStatusInfo($applicationUid, 0, $userUid); $flagParticipated = false; - if ($arrayResult) { + if ($arrayResult || $userAccess) { $flagParticipated = true; } return $flagParticipated; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Consolidated.php b/workflow/engine/src/ProcessMaker/BusinessModel/Consolidated.php index 0941bc724..3b332e3a9 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Consolidated.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Consolidated.php @@ -6,7 +6,6 @@ use \Smarty; use \Criteria; use \ReportTablePeer; use \ResultSet; -use \AppCacheViewPeer; use \CaseConsolidatedCorePeer; use \ContentPeer; @@ -31,15 +30,11 @@ class Consolidated $criteria = new Criteria(); $criteria->addSelectColumn(CaseConsolidatedCorePeer::DYN_UID); $criteria->addSelectColumn(\ReportTablePeer::REP_TAB_NAME); + $criteria->addAsColumn('CON_VALUE', \ReportTablePeer::REP_TAB_TITLE); $criteria->addSelectColumn(\ReportTablePeer::REP_TAB_UID); $criteria->addSelectColumn(ContentPeer::CON_VALUE); $criteria->addSelectColumn(CaseConsolidatedCorePeer::CON_STATUS); - $criteria->addJoin( CaseConsolidatedCorePeer::REP_TAB_UID, ReportTablePeer::REP_TAB_UID, Criteria::LEFT_JOIN ); - $criteria->addJoin( CaseConsolidatedCorePeer::REP_TAB_UID, ContentPeer::CON_ID, Criteria::LEFT_JOIN ); - $criteria->add( ContentPeer::CON_CATEGORY, "REP_TAB_TITLE"); - $criteria->add( ContentPeer::CON_LANG, SYS_LANG); - $criteria->add( CaseConsolidatedCorePeer::TAS_UID, $tas_uid, Criteria::EQUAL ); $criteria->add( CaseConsolidatedCorePeer::CON_STATUS, 'ACTIVE', Criteria::EQUAL ); @@ -74,7 +69,6 @@ class Consolidated */ public function postDerivate ($app_uid, $app_number, $del_index, $usr_uid, $fieldName='', $fieldValue='') { - G::LoadClass("library"); G::LoadClass("wsBase"); G::LoadClass("case"); $ws = new \wsBase(); @@ -118,7 +112,7 @@ class Consolidated $response = array(); - $response["casesNumRec"] = \Library::getCasesNumRec($usr_uid); + $response["casesNumRec"] = self::getCasesNumRec($usr_uid); if (is_array($res)) { $response ["message"] = "" . G::LoadTranslation("ID_CASE") . " " . $app_number . " " . @@ -130,6 +124,35 @@ class Consolidated return $response; } + /** + * @param $userUid + * @return int + */ + public static function getCasesNumRec($userUid) + { + $criteria = new Criteria("workflow"); + $criteria->addSelectColumn(CaseConsolidatedCorePeer::CON_STATUS); + $criteria->add(CaseConsolidatedCorePeer::CON_STATUS, "ACTIVE"); + $activeNumRec = CaseConsolidatedCorePeer::doCount($criteria); + $numRec = 0; + + $criteria->clearSelectColumns(); + $criteria->addAsColumn('NUMREC', 'COUNT(' . \ListInboxPeer::TAS_UID . ')'); + $criteria->addJoin(CaseConsolidatedCorePeer::TAS_UID, \ListInboxPeer::TAS_UID, \Criteria::LEFT_JOIN); + $criteria->add(\ListInboxPeer::USR_UID, $userUid, Criteria::EQUAL); + $criteria->add(\ListInboxPeer::APP_STATUS, 'TO_DO', Criteria::EQUAL); + $rsSql = CaseConsolidatedCorePeer::doSelectRS($criteria); + $rsSql->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + while ($rsSql->next()) { + $row = $rsSql->getRow(); + $numRec = $row["NUMREC"]; + } + + $numRec = ($activeNumRec > 0) ? $numRec : 0; + return $numRec; + } + /** * Put Data Generate @@ -235,11 +258,12 @@ class Consolidated $response = array(); $searchFields = array(); - // - $query = "SELECT REP_TAB_UID - FROM CASE_CONSOLIDATED - WHERE TAS_UID = '" . $tas_uid . "'"; - $caseConsolidated = executeQuery($query); + + $criteria = new Criteria(); + $criteria->addSelectColumn(CaseConsolidatedCorePeer::REP_TAB_UID); + $criteria->add(CaseConsolidatedCorePeer::TAS_UID, $tas_uid, Criteria::EQUAL); + $caseConsolidated = CaseConsolidatedCorePeer::doSelectRS($criteria); + $caseConsolidated->setFetchmode(ResultSet::FETCHMODE_ASSOC); $tableUid = null; $tableName = null; @@ -273,12 +297,11 @@ class Consolidated $oCriteria->addSelectColumn("*"); $oCriteria->addSelectColumn($tableName . ".APP_UID"); - $oCriteria->addJoin($tableName . ".APP_UID", AppCacheViewPeer::APP_UID, Criteria::LEFT_JOIN); + $oCriteria->addJoin($tableName . ".APP_UID", \ListInboxPeer::APP_UID, \Criteria::LEFT_JOIN); - $oCriteria->add(AppCacheViewPeer::DEL_THREAD_STATUS, "OPEN"); - $oCriteria->add(AppCacheViewPeer::TAS_UID, $tas_uid); - $oCriteria->add(AppCacheViewPeer::USR_UID, $usr_uid); - $oCriteria->add(AppCacheViewPeer::APP_STATUS, "TO_DO"); + $oCriteria->add(\ListInboxPeer::TAS_UID, $tas_uid); + $oCriteria->add(\ListInboxPeer::USR_UID, $usr_uid); + $oCriteria->add(\ListInboxPeer::APP_STATUS, "TO_DO"); if ($search != "") { $filename = $pro_uid . PATH_SEP . $dyn_uid . ".xml"; @@ -333,10 +356,10 @@ class Consolidated if ($oTmpCriteria != null) { $oCriteria->add( - $oCriteria->getNewCriterion(AppCacheViewPeer::APP_NUMBER, $search, Criteria::LIKE)->addOr($oTmpCriteria) + $oCriteria->getNewCriterion(\ListInboxPeer::APP_NUMBER, $search, Criteria::LIKE)->addOr($oTmpCriteria) ); } else { - $oCriteria->add($oCriteria->getNewCriterion(AppCacheViewPeer::APP_NUMBER, $search, Criteria::LIKE)); + $oCriteria->add($oCriteria->getNewCriterion(\ListInboxPeer::APP_NUMBER, $search, Criteria::LIKE)); } } @@ -344,7 +367,7 @@ class Consolidated $filter = new \InputFilter(); if ($sort != "") { - $reportTable = new ReportTables(); + $reportTable = new \ReportTables(); $arrayReportTableVar = $reportTable->getTableVars($tableUid); $tableName = $filter->validateInput($tableName); $sort = $filter->validateInput($sort); @@ -352,7 +375,7 @@ class Consolidated $sort = strtoupper($sort); eval('$field = ' . $tableName . 'Peer::' . $sort . ';'); } else { - eval('$field = AppCacheViewPeer::' . $sort . ';'); + eval('$field = \ListInboxPeer::' . $sort . ';'); } if ($dir == "ASC") { @@ -361,7 +384,7 @@ class Consolidated $oCriteria->addDescendingOrderByColumn($field); } } else { - $oCriteria->addDescendingOrderByColumn(AppCacheViewPeer::APP_NUMBER); + $oCriteria->addDescendingOrderByColumn(\ListInboxPeer::APP_NUMBER); } //pagination pagination attributes @@ -369,7 +392,7 @@ class Consolidated $oCriteria->setOffset($start); //end of pagination attributes - $oDataset = AppCacheViewPeer::doSelectRS($oCriteria); + $oDataset = \ListInboxPeer::doSelectRS($oCriteria); //eval('$oDataset = '.$className.'Peer::doSelectRS($oCriteria);'); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); @@ -404,17 +427,15 @@ class Consolidated $response["data"][] = $val; } - $query = "SELECT COUNT(APP_CACHE_VIEW.TAS_UID) AS QTY - FROM CASE_CONSOLIDATED - LEFT JOIN CONTENT ON (CASE_CONSOLIDATED.TAS_UID = CONTENT.CON_ID) - LEFT JOIN APP_CACHE_VIEW ON (CASE_CONSOLIDATED.TAS_UID = APP_CACHE_VIEW.TAS_UID) - LEFT JOIN TASK ON (CASE_CONSOLIDATED.TAS_UID = TASK.TAS_UID) - WHERE CONTENT.CON_CATEGORY = 'TAS_TITLE' AND - CONTENT.CON_LANG = 'en' AND - APP_CACHE_VIEW.DEL_THREAD_STATUS = 'OPEN' AND - USR_UID = '" . $usr_uid . "' AND - APP_CACHE_VIEW.TAS_UID = '" . $tas_uid . "'"; - $count = executeQuery($query); + $criteria = new Criteria(); + $criteria->addAsColumn('QTY', 'COUNT(' . \ListInboxPeer::TAS_UID . ')'); + $criteria->addJoin(\CaseConsolidatedCorePeer::TAS_UID, \TaskPeer::TAS_UID, \Criteria::LEFT_JOIN); + $criteria->addJoin(\CaseConsolidatedCorePeer::TAS_UID, \ListInboxPeer::TAS_UID, \Criteria::LEFT_JOIN); + $criteria->add(\ListInboxPeer::USR_UID, $usr_uid, \Criteria::EQUAL); + $criteria->add(\ListInboxPeer::TAS_UID, $tas_uid, \Criteria::EQUAL); + $criteria->add(\ListInboxPeer::APP_STATUS, 'TO_DO', \Criteria::EQUAL); + $count = CaseConsolidatedCorePeer::doSelectRS($criteria); + $count->setFetchmode(ResultSet::FETCHMODE_ASSOC); $totalCount = 0; foreach ($count as $item) { @@ -1115,10 +1136,9 @@ class Consolidated { $criteria = new Criteria(); $criteria->add(\CaseConsolidatedCorePeer::CON_STATUS, 'ACTIVE'); - $criteria->addJoin(\CaseConsolidatedCorePeer::TAS_UID, \AppCacheViewPeer::TAS_UID, Criteria::LEFT_JOIN); - $criteria->add(\AppCacheViewPeer::USR_UID, $usrUid); - $criteria->add(\AppCacheViewPeer::DEL_THREAD_STATUS, 'OPEN'); - $criteria->add(\AppCacheViewPeer::APP_STATUS, 'TO_DO'); + $criteria->addJoin(\CaseConsolidatedCorePeer::TAS_UID, \ListInboxPeer::TAS_UID, Criteria::LEFT_JOIN); + $criteria->add(\ListInboxPeer::USR_UID, $usrUid, Criteria::EQUAL); + $criteria->add(\ListInboxPeer::APP_STATUS, 'TO_DO',Criteria::EQUAL); $total = \CaseConsolidatedCorePeer::doCount($criteria); return (int)$total; } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Light.php b/workflow/engine/src/ProcessMaker/BusinessModel/Light.php index 65aaa3808..e739eb485 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Light.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Light.php @@ -69,16 +69,18 @@ class Light $task->setArrayParamException(array("taskUid" => "act_uid", "stepUid" => "step_uid")); $webEntryEvent = new \ProcessMaker\BusinessModel\WebEntryEvent(); - $webEntryEvent->setFormatFieldNameInUppercase(false); - $webEntryEvent->setArrayFieldNameForException(array("processUid" => "prj_uid")); + $arrayWebEntryEvent = array(); + $allWebEntryEvents = $webEntryEvent->getAllWebEntryEvents(); + foreach ($allWebEntryEvents as $webEntryEvents) { + $arrayWebEntryEvent[] = $webEntryEvents["ACT_UID"]; + } $step = new \ProcessMaker\Services\Api\Project\Activity\Step(); $response = array(); foreach ($processList as $key => $processInfo) { $tempTreeChildren = array (); foreach ($processList[$key] as $keyChild => $processInfoChild) { - $webEntryEventStart = $webEntryEvent->getWebEntryEvents($processInfoChild['pro_uid']); - if (empty($webEntryEventStart) && in_array($processInfoChild['pro_uid'], $bpmnProjects)) { + if (!in_array($processInfoChild['uid'], $arrayWebEntryEvent) && in_array($processInfoChild['pro_uid'], $bpmnProjects)) { $tempTreeChild['text'] = $keyChild; //ellipsis ( $keyChild, 50 ); $tempTreeChild['processId'] = $processInfoChild['pro_uid']; $tempTreeChild['taskId'] = $processInfoChild['uid']; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/WebEntryEvent.php b/workflow/engine/src/ProcessMaker/BusinessModel/WebEntryEvent.php index 9850a47ea..6dffa896b 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/WebEntryEvent.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/WebEntryEvent.php @@ -898,6 +898,31 @@ class WebEntryEvent } } + /** + * Get all WebEntry-Events + * Return an array with all WebEntry-Events + * @return array + * @throws \Exception + */ + public function getAllWebEntryEvents() + { + try { + $result = array(); + $criteria = $this->getWebEntryEventCriteria(); + $criteria->addJoin(\WebEntryEventPeer::PRJ_UID, \ProcessPeer::PRO_UID, \Criteria::JOIN); + $criteria->add(\ProcessPeer::PRO_STATUS, 'ACTIVE', \Criteria::EQUAL); + $rsCriteria = \WebEntryEventPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + while ($rsCriteria->next()) { + $row = $rsCriteria->getRow(); + $result[] = $this->getWebEntryEventDataFromRecord($row); + } + return $result; + } catch (\Exception $e) { + throw $e; + } + } + /** * Get data of a WebEntry-Event * diff --git a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php index d6dd9c209..dafe61a98 100644 --- a/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php +++ b/workflow/engine/src/ProcessMaker/Core/RoutingScreen.php @@ -65,6 +65,9 @@ class RoutingScreen extends \Derivation } else { $aDataMerged[$key]['NEXT_ROUTING'][] = $post[$i]; } + if (isset($post[$i]['NEXT_TASK'])) { + $aDataMerged[$key]['NEXT_TASK'] = $post[$i]['NEXT_TASK']; + } } } } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php index 9fcdb2635..c3df40aa5 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php @@ -60,7 +60,6 @@ class Cases extends Api //Check if the user is supervisor process $case = new \ProcessMaker\BusinessModel\Cases(); - $supervisor = new \ProcessMaker\BusinessModel\ProcessSupervisor(); $user = new \ProcessMaker\BusinessModel\User(); $count = 0; @@ -70,10 +69,10 @@ class Cases extends Api if (!empty($arrayApplicationData)) { if (!$user->checkPermission($usrUid, 'PM_REASSIGNCASE')) { - if($user->checkPermission($usrUid, 'PM_REASSIGNCASE_SUPERVISOR')){ + if ($user->checkPermission($usrUid, 'PM_REASSIGNCASE_SUPERVISOR')) { $supervisor = new \ProcessMaker\BusinessModel\ProcessSupervisor(); $flagps = $supervisor->isUserProcessSupervisor($arrayApplicationData['PRO_UID'], $usrUid); - if(!$flagps){ + if (!$flagps) { $count = $count + 1; } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Light.php b/workflow/engine/src/ProcessMaker/Services/Api/Light.php index 80f288b49..32757d56a 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Light.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Light.php @@ -30,6 +30,31 @@ class Light extends Api 'delRiskDate' ]; + public function __isAllowed() + { + try { + $methodName = $this->restler->apiMethodInfo->methodName; + $arrayArgs = $this->restler->apiMethodInfo->arguments; + switch ($methodName) { + case 'doIfAlreadyRoute': + $applicationUid = $this->parameters[$arrayArgs['app_uid']]; + $delIndex = $this->parameters[$arrayArgs['cas_index']]; + $userUid = $this->getUserId(); + //Check if the user has the case + $appDelegation = new \AppDelegation(); + $aCurUser = $appDelegation->getCurrentUsers($applicationUid, $delIndex); + if (!empty($aCurUser) && in_array($userUid, $aCurUser)) { + return true; + } + return false; + break; + } + return false; + } catch (\Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + /** * Constructor of the class * @@ -793,6 +818,8 @@ class Light extends Api /** * Get Already Route * + * @access protected + * @class AccessControl {@className \ProcessMaker\Services\Api\Light} * @param string $app_uid {@min 1}{@max 32} * @param int $cas_index * diff --git a/workflow/engine/templates/app/main.js b/workflow/engine/templates/app/main.js index bb52fa407..cef2996a1 100644 --- a/workflow/engine/templates/app/main.js +++ b/workflow/engine/templates/app/main.js @@ -589,12 +589,12 @@ var openSummaryWindow = function(appUid, delIndex, action) ] }); tabs.push({ - title: Ext.util.Format.capitalize(_('ID_MORE_INFORMATION')), + title: _('ID_MORE_INFORMATION'), layout: 'fit', items: [panel] }); } else { - tabs.push({title: Ext.util.Format.capitalize(_('ID_MORE_INFORMATION')), bodyCfg: { + tabs.push({title: _('ID_MORE_INFORMATION'), bodyCfg: { tag: 'iframe', id: 'summaryIFrame', src: '../cases/summary?APP_UID=' + appUid + '&DEL_INDEX=' + delIndex + '&DYN_UID=' + response.dynUid, @@ -604,7 +604,7 @@ var openSummaryWindow = function(appUid, delIndex, action) } } - tabs.push({title: Ext.util.Format.capitalize(_('ID_UPLOADED_DOCUMENTS')), bodyCfg: { + tabs.push({title: _('ID_UPLOADED_DOCUMENTS'), bodyCfg: { tag: 'iframe', id: 'summaryIFrame', src: '../cases/ajaxListener?action=uploadedDocumentsSummary', @@ -612,7 +612,7 @@ var openSummaryWindow = function(appUid, delIndex, action) onload: '' }}); - tabs.push({title: Ext.util.Format.capitalize(_('ID_GENERATED_DOCUMENTS')), bodyCfg: { + tabs.push({title: _('ID_GENERATED_DOCUMENTS'), bodyCfg: { tag: 'iframe', id: 'summaryIFrame', src: '../cases/ajaxListener?action=generatedDocumentsSummary', diff --git a/workflow/engine/templates/cases/caseHistory.js b/workflow/engine/templates/cases/caseHistory.js index d8d0596ab..05e77da55 100644 --- a/workflow/engine/templates/cases/caseHistory.js +++ b/workflow/engine/templates/cases/caseHistory.js @@ -241,7 +241,7 @@ return actionTranslate; }; - + var pageSize = 15; processesGrid = new Ext.grid.GridPanel({ region: 'center', layout: 'fit', @@ -293,7 +293,7 @@ } ], bbar: new Ext.PagingToolbar({ - pageSize: 15, + pageSize: pageSize, store: store, displayInfo: true, displayMsg: _('ID_DISPLAY_PROCESSES'), @@ -312,7 +312,7 @@ } }); - processesGrid.store.load({params: {"function":"languagesList"}}); + processesGrid.store.load({params: {"function":"languagesList", "start": 0, "limit": pageSize}}); processesGrid.store.on( 'load', diff --git a/workflow/engine/templates/cases/casesList.js b/workflow/engine/templates/cases/casesList.js index d0344047b..430c0ea94 100644 --- a/workflow/engine/templates/cases/casesList.js +++ b/workflow/engine/templates/cases/casesList.js @@ -2050,7 +2050,8 @@ Ext.onReady ( function() { btnReassign, "->", _("ID_USER"), - comboAllUsers, + suggestUser, + resetSuggestButton, "-", _("ID_CATEGORY"), comboCategory, diff --git a/workflow/engine/templates/cases/casesUploadedDocumentsPage.js b/workflow/engine/templates/cases/casesUploadedDocumentsPage.js index 136a31057..f1581980c 100644 --- a/workflow/engine/templates/cases/casesUploadedDocumentsPage.js +++ b/workflow/engine/templates/cases/casesUploadedDocumentsPage.js @@ -373,6 +373,7 @@ } return actionTranslate; }; + var pageSize = 25; var processesGrid = new Ext.grid.GridPanel({ region: 'center', layout: 'fit', @@ -487,7 +488,7 @@ } ], bbar: new Ext.PagingToolbar({ - pageSize: 10, + pageSize: pageSize, store: store, displayInfo: true, displayMsg: _('ID_DISPLAY_PROCESSES'), @@ -515,7 +516,7 @@ } } }); - processesGrid.store.load({params: {"function":"languagesList"}}); + processesGrid.store.load({params: {"function": "languagesList", "start": 0, "limit": pageSize}}); processesGrid.store.on( 'load', diff --git a/workflow/engine/templates/processes/main.js b/workflow/engine/templates/processes/main.js index 43adb6cb0..66765f905 100644 --- a/workflow/engine/templates/processes/main.js +++ b/workflow/engine/templates/processes/main.js @@ -1626,12 +1626,27 @@ importProcessExistGroup = function() success : function(o, resp) { var resp_ = Ext.util.JSON.decode(resp.response.responseText); var sNewProUid = resp_.sNewProUid; - - if (typeof(resp_.project_type) != "undefined" && resp_.project_type == "bpmn") { - var goTo = importProcessCallbackFile ? importProcessCallbackFile : "../designer?prj_uid="; - openWindowIfIE(goTo + sNewProUid); + if (resp_.catchMessage === '') { + if (typeof (resp_.project_type) != "undefined" && resp_.project_type == "bpmn") { + var goTo = importProcessCallbackFile ? importProcessCallbackFile : "../designer?prj_uid="; + openWindowIfIE(goTo + sNewProUid); + } else { + window.location.href = "processes_Map?PRO_UID=" + sNewProUid; + } } else { - window.location.href = "processes_Map?PRO_UID=" + sNewProUid; + Ext.getCmp('objectsToImport').setValue(""); + Ext.getCmp('importProcessExistGroupWindow').close(); + Ext.getCmp('importProcessExistProcessWindow').close(); + Ext.getCmp('importProcessWindow').close(); + Ext.MessageBox.show({ + title: _('ID_ERROR'), + msg: resp_.catchMessage, + buttons: Ext.MessageBox.OK, + animEl: 'mb9', + fn: function () {}, + icon: Ext.MessageBox.ERROR + }); + processesGrid.store.reload(); } }, failure: function(o, resp) {