diff --git a/Rakefile b/Rakefile index 8ffc4d77f..c0d680a19 100644 --- a/Rakefile +++ b/Rakefile @@ -141,6 +141,7 @@ def generateEnviromentVariables() file = File.read('./config/enviromentvariables.json') dataUser = JSON.parse(file) content = content + "__env.USER_GUEST = " + JSON.generate(dataUser['constants']['userguest']) + content = content + "; __env.pmVariable = " + JSON.generate(dataUser['validation']['pmVariable']) dir = "vendor/colosa/MichelangeloFE/src/enviroment/" # create a directory enviroment FileUtils.mkdir_p(dir) diff --git a/config/constants.php b/config/constants.php new file mode 100644 index 000000000..f51963dc0 --- /dev/null +++ b/config/constants.php @@ -0,0 +1,10 @@ + [ + 'pmVariable' => [ + 'regEx' => '/^[a-zA-Z\_]{1}\w+$/' + ] + ] +]; + diff --git a/config/enviromentvariables.json b/config/enviromentvariables.json index 57d9fc8da..e97f1b876 100644 --- a/config/enviromentvariables.json +++ b/config/enviromentvariables.json @@ -8,5 +8,10 @@ "lastname": "Guest", "username": "guest" } + }, + "validation": { + "pmVariable": { + "regEx": "/^[a-zA-Z\\_]{1}\\w+$/" + } } } \ No newline at end of file diff --git a/gulliver/system/class.bootstrap.php b/gulliver/system/class.bootstrap.php index aad745212..4b1bd7c44 100644 --- a/gulliver/system/class.bootstrap.php +++ b/gulliver/system/class.bootstrap.php @@ -1,6 +1,7 @@ \G::getIpAddress() - ,'timeZone' => $date - ,'workspace' => $sysSys - ); - return $aContext; + public static function getDefaultContextLog() + { + + global $RBAC; + $info = [ + 'ip' => G::getIpAddress(), + 'workspace' => !empty(config('system.workspace')) ? config('system.workspace') : 'Undefined Workspace', + 'timeZone' => DateTime::convertUtcToTimeZone(date('Y-m-d H:m:s')) + ]; + + if ($RBAC !== null) { + $userInfo = [ + 'usrUid' => $RBAC->aUserInfo['USER_INFO']['USR_UID'] + ]; + $info = array_merge($info, $userInfo); + } + //Some endpoints can defined the USER_LOGGED + if (empty($info['usrUid'])) { + $user = !empty($_SESSION['USER_LOGGED']) ? $_SESSION['USER_LOGGED'] : G::LoadTranslation('UID_UNDEFINED_USER'); + $userInfo = [ + 'usrUid' => $user + ]; + $info = array_merge($info, $userInfo); + } + + return $info; } /** diff --git a/gulliver/system/class.monologProvider.php b/gulliver/system/class.monologProvider.php index ad15960e8..03a84e6b9 100644 --- a/gulliver/system/class.monologProvider.php +++ b/gulliver/system/class.monologProvider.php @@ -26,7 +26,7 @@ class MonologProvider private $registerLogger; //the default format "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"; - private $output = "<%level%> %datetime% %channel% %level_name%: %message% %context% %extra%\n"; + private $output = "<%level%> %datetime% %channel% %level_name%: %message% %context%\n"; private $dateFormat = 'M d H:i:s'; /** * The maximal amount of files to keep (0 means unlimited) diff --git a/gulpfile.js b/gulpfile.js index 2ecbb281b..5e9b4c5cc 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -471,6 +471,37 @@ gulp.task('clean', function () { cleanDirectory('workflow/public_html/lib'); }); +/** + * Exports from the config/constants.php the configuration constants to the + * enviromentvariables.json file + */ +gulp.task('exportBackendConstants', function () { + var runner = require('child_process'); + gutil.log(gutil.colors.green('Export ProcessMaker constants...')); + + var envVarsJsonFile = 'config/enviromentvariables.json'; + + var code = 'require_once "gulliver/system/class.g.php";' + + 'require_once "bootstrap/autoload.php";' + + 'require_once "bootstrap/app.php";' + + 'app()->make(Illuminate\\Foundation\\Http\\Kernel::class)->bootstrap();' + + 'print(json_encode(config("constants", JSON_UNESCAPED_SLASHES)));'; + + runner.exec( + 'php -r \'' + code + '\'', + function (err, stdout, stderr) { + var pmConstants = JSON.parse(stdout); + var envVar = JSON.parse(fs.readFileSync(envVarsJsonFile)); + + for (var attr in pmConstants) { + envVar[attr] = pmConstants[attr]; + } + + fs.writeFileSync(envVarsJsonFile, JSON.stringify(envVar, null, 2)); + return pmConstants; + }); +}); + /** * This scheduled task is to be able to create the guest user constants */ @@ -490,7 +521,7 @@ gulp.task('__env', function (cb) { ); }); -gulp.task('default', ['clean', '__env'], function (cb) { +gulp.task('default', ['clean', 'exportBackendConstants', '__env'], function (cb) { var i, tasks = []; gutil.log(gutil.colors.green('Initializing ProcessMaker building...')); @@ -499,4 +530,5 @@ gulp.task('default', ['clean', '__env'], function (cb) { tasks.push(_.bind(processTask, config[i])); } executeSequence(tasks, cb); -}); \ No newline at end of file +}); + diff --git a/workflow/engine/bin/cron_single.php b/workflow/engine/bin/cron_single.php index cc9dc246e..9019c0721 100644 --- a/workflow/engine/bin/cron_single.php +++ b/workflow/engine/bin/cron_single.php @@ -9,16 +9,12 @@ require_once __DIR__ . '/../../../bootstrap/app.php'; use ProcessMaker\Core\System; use ProcessMaker\Plugins\PluginRegistry; -register_shutdown_function( - create_function( - '', - ' - if (class_exists("Propel")) { - Propel::close(); - } - ' - ) -); +$fn = ' + if (class_exists("Propel")) { + Propel::close(); + } + '; +register_shutdown_function(create_function('', $fn)); ini_set('memory_limit', '512M'); @@ -45,8 +41,7 @@ try { $cronName = $argv[4]; $workspace = $argv[5]; $dateSystem = $argv[6]; - $sNow = $argv[7]; //$date - + $sNow = $argv[7]; //date //Defines constants define('PATH_SEP', ($osIsLinux) ? '/' : '\\'); @@ -68,10 +63,7 @@ try { $classLoader->add(PATH_TRUNK . 'workflow' . PATH_SEP . 'engine' . PATH_SEP . 'src' . PATH_SEP); //Add vendors to autoloader - //$classLoader->add(PATH_TRUNK . 'vendor' . PATH_SEP . 'luracast' . PATH_SEP . 'restler' . PATH_SEP . 'vendor', 'Luracast'); - //$classLoader->add(PATH_TRUNK . 'vendor' . PATH_SEP . 'bshaffer' . PATH_SEP . 'oauth2-server-php' . PATH_SEP . 'src' . PATH_SEP, 'OAuth2'); - $classLoader->addClass('Bootstrap', - PATH_TRUNK . 'gulliver' . PATH_SEP . 'system' . PATH_SEP . 'class.bootstrap.php'); + $classLoader->addClass('Bootstrap', PATH_TRUNK . 'gulliver' . PATH_SEP . 'system' . PATH_SEP . 'class.bootstrap.php'); $classLoader->addModelClassPath(PATH_TRUNK . 'workflow' . PATH_SEP . 'engine' . PATH_SEP . 'classes' . PATH_SEP . 'model' . PATH_SEP); @@ -89,7 +81,6 @@ try { ini_set('error_reporting', $e_all); ini_set('short_open_tag', 'On'); ini_set('default_charset', 'UTF-8'); - //ini_set('memory_limit', $arraySystemConfiguration['memory_limit']); ini_set('soap.wsdl_cache_enabled', $arraySystemConfiguration['wsdl_cache']); ini_set('date.timezone', $arraySystemConfiguration['time_zone']); @@ -99,9 +90,6 @@ try { define('MEMCACHED_ENABLED', $arraySystemConfiguration['memcached']); define('MEMCACHED_SERVER', $arraySystemConfiguration['memcached_server']); - //require_once(PATH_GULLIVER . PATH_SEP . 'class.bootstrap.php'); - //define('PATH_GULLIVER_HOME', PATH_TRUNK . 'gulliver' . PATH_SEP); - spl_autoload_register(['Bootstrap', 'autoloadClass']); //Set variables @@ -168,8 +156,7 @@ try { while (!feof($fileDb)) { $buffer = fgets($fileDb, 4096); //Read a line - $phpCode .= preg_replace('/define\s*\(\s*[\x22\x27](.*)[\x22\x27]\s*,\s*(\x22.*\x22|\x27.*\x27)\s*\)\s*;/i', - '$$1 = $2;', $buffer); + $phpCode .= preg_replace('/define\s*\(\s*[\x22\x27](.*)[\x22\x27]\s*,\s*(\x22.*\x22|\x27.*\x27)\s*\)\s*;/i', '$$1 = $2;', $buffer); } fclose($fileDb); @@ -189,8 +176,6 @@ try { $dsnRbac .= '?encoding=utf8'; break; case 'mssql': - //$dsn .= '?sendStringAsUnicode=false'; - //$dsnRbac .= '?sendStringAsUnicode=false'; break; default: break; @@ -203,15 +188,12 @@ try { $pro['datasources']['rbac']['adapter'] = $DB_ADAPTER; $pro['datasources']['rp']['connection'] = $dsnRp; $pro['datasources']['rp']['adapter'] = $DB_ADAPTER; - //$pro['datasources']['dbarray']['connection'] = 'dbarray://user:pass@localhost/pm_os'; - //$pro['datasources']['dbarray']['adapter'] = 'dbarray'; $oFile = fopen(PATH_CORE . 'config' . PATH_SEP . '_databases_.php', 'w'); fwrite($oFile, ''); fclose($oFile); Propel::init(PATH_CORE . 'config' . PATH_SEP . '_databases_.php'); - //Creole::registerDriver('dbarray', 'creole.contrib.DBArrayConnection'); //Enable RBAC $rbac = RBAC::getSingleton(PATH_DATA, session_id()); @@ -226,7 +208,7 @@ try { /*----------------------------------********---------------------------------*/ if (PMLicensedFeatures::getSingleton()->verifyfeature('oq3S29xemxEZXJpZEIzN01qenJUaStSekY4cTdJVm5vbWtVM0d4S2lJSS9qUT0=')) { - $systemUtcTimeZone = (int)($arraySystemConfiguration['system_utc_time_zone']) == 1; + $systemUtcTimeZone = (int) ($arraySystemConfiguration['system_utc_time_zone']) == 1; } /*----------------------------------********---------------------------------*/ @@ -234,6 +216,12 @@ try { define('TIME_ZONE', ini_get('date.timezone')); + //UTC time zone + if ($systemUtcTimeZone) { + $sNow = convertToSystemUtcTimeZone($sNow); + $dateSystem = convertToSystemUtcTimeZone($dateSystem); + } + //Processing eprintln('Processing workspace: ' . $workspace, 'green'); @@ -261,7 +249,7 @@ try { case 'timereventcron': $timerEvent = new \ProcessMaker\BusinessModel\TimerEvent(); - $timerEvent->startContinueCaseByTimerEvent(date('Y-m-d H:i:s'), true); + $timerEvent->startContinueCaseByTimerEvent($sNow, true); break; case 'sendnotificationscron': sendNotifications(); @@ -434,7 +422,6 @@ function executePlugins() } // Executing registered cron files - // -> Get registered cron files $oPluginRegistry = PluginRegistry::loadSingleton(); $cronFiles = $oPluginRegistry->getCronFiles(); @@ -445,7 +432,7 @@ function executePlugins() /** * @var \ProcessMaker\Plugins\Interfaces\CronFile $cronFile */ - foreach($cronFiles as $cronFile) { + foreach ($cronFiles as $cronFile) { $path = PATH_PLUGINS . $cronFile->getNamespace() . PATH_SEP . 'bin' . PATH_SEP . $cronFile->getCronFile() . '.php'; if (file_exists($path)) { executeCustomCronFunction($path, $cronFile->getCronFile()); @@ -503,8 +490,8 @@ function calculateDuration() saveLog('calculateDuration', 'error', 'Error Calculating Duration: ' . $oError->getMessage()); } } - /*----------------------------------********---------------------------------*/ + function calculateAppDuration() { global $argvx; @@ -527,7 +514,6 @@ function calculateAppDuration() saveLog('calculateDurationByApp', 'error', 'Error Calculating Duration: ' . $oError->getMessage()); } } - /*----------------------------------********---------------------------------*/ function executeEvents($sLastExecution, $sNow = null) @@ -559,7 +545,6 @@ function executeEvents($sLastExecution, $sNow = null) setExecutionMessage("|- End Execution events"); setExecutionResultMessage("Processed $n"); - //saveLog('executeEvents', 'action', $res ); } catch (Exception $oError) { setExecutionResultMessage('WITH ERRORS', 'error'); eprintln(" '-" . $oError->getMessage(), 'red'); @@ -581,10 +566,8 @@ function executeScheduledCases($sNow = null) setExecutionMessage("Executing the scheduled starting cases"); setExecutionResultMessage('PROCESSING'); - $runDate = runDateForScheduledCases($sNow); - $oCaseScheduler = new CaseScheduler(); - $oCaseScheduler->caseSchedulerCron($runDate, $log, 1); + $oCaseScheduler->caseSchedulerCron($sNow, $log, 1); foreach ($log as $value) { $arrayCron = unserialize(trim(@file_get_contents(PATH_DATA . "cron"))); @@ -601,7 +584,7 @@ function executeScheduledCases($sNow = null) } } -function runDateForScheduledCases($sNow) +function convertToSystemUtcTimeZone($sNow) { global $arraySystemConfiguration; @@ -610,7 +593,7 @@ function runDateForScheduledCases($sNow) $systemUtcTimeZone = false; /*----------------------------------********---------------------------------*/ if (PMLicensedFeatures::getSingleton()->verifyfeature('oq3S29xemxEZXJpZEIzN01qenJUaStSekY4cTdJVm5vbWtVM0d4S2lJSS9qUT0=')) { - $systemUtcTimeZone = (int)($arraySystemConfiguration['system_utc_time_zone']) == 1; + $systemUtcTimeZone = (int) ($arraySystemConfiguration['system_utc_time_zone']) == 1; } /*----------------------------------********---------------------------------*/ @@ -766,7 +749,7 @@ function executeCaseSelfService() $appcacheDelDelegateDate, $taskSelfServiceTime, $taskSelfServiceTimeUnit //HOURS|DAYS|MINUTES - //1 + //1 ); if (time() > $dueDate["DUE_DATE_SECONDS"] && $flag == false) { @@ -898,8 +881,8 @@ function setExecutionResultMessage($m, $t = '') eprintln("[$m]", $c); } - /*----------------------------------********---------------------------------*/ + function fillReportByUser() { try { @@ -1017,7 +1000,6 @@ function synchronizeGmailLabels() saveLog("synchronizeGmailLabels", "error", "Error when synchronizing Gmail labels: " . $e->getMessage()); } } - /*----------------------------------********---------------------------------*/ function sendNotifications() diff --git a/workflow/engine/classes/Applications.php b/workflow/engine/classes/Applications.php index af0b1630a..5f7cf4e61 100644 --- a/workflow/engine/classes/Applications.php +++ b/workflow/engine/classes/Applications.php @@ -152,6 +152,7 @@ class Applications if ($columnSearch === 'APP_NUMBER' || $columnSearch === 'APP_TITLE') { $sqlSearch = "SELECT APPLICATION.APP_NUMBER FROM APPLICATION"; $sqlSearch .= " WHERE APPLICATION.{$columnSearch} LIKE '%{$search}%'"; + $orderByColumnSearch = " ORDER BY APPLICATION.{$columnSearch} " . $dir; switch ($columnSearch) { case 'APP_TITLE': break; @@ -166,6 +167,7 @@ class Applications } break; } + $sqlSearch .= $orderByColumnSearch; if (!empty($start)) { $sqlSearch .= " LIMIT $start, " . $limit; } else { diff --git a/workflow/engine/classes/Cases.php b/workflow/engine/classes/Cases.php index 91c2bfc15..8d489e3d5 100644 --- a/workflow/engine/classes/Cases.php +++ b/workflow/engine/classes/Cases.php @@ -912,7 +912,7 @@ class Cases $appDataWithoutDynContentHistory = serialize($FieldsDifference); $aFieldsHistory['APP_DATA'] = serialize($FieldsDifference); $appHistory->insertHistory($aFieldsHistory); - + /*----------------------------------********---------------------------------*/ $type = isset($Fields['OBJECT_TYPE']) ? $Fields['OBJECT_TYPE'] : ChangeLog::getChangeLog()->getObjectNameById(ChangeLog::DYNAFORM); @@ -1152,12 +1152,13 @@ class Cases $nameFiles .= $node['file'] . ":" . $node['function'] . "(" . $node['line'] . ")\n"; } } - $dataLog = \Bootstrap::getDefaultContextLog(); - $dataLog['usrUid'] = isset($_SESSION['USER_LOGGED']) ? $_SESSION['USER_LOGGED'] : G::LoadTranslation('UID_UNDEFINED_USER'); - $dataLog['appUid'] = $sAppUid; - $dataLog['request'] = $nameFiles; - $dataLog['action'] = 'DeleteCases'; - Bootstrap::registerMonolog('DeleteCases', 200, 'Delete Case', $dataLog, $dataLog['workspace'], 'processmaker.log'); + + /** ProcessMaker log*/ + $context = Bootstrap::getDefaultContextLog(); + $context['appUid'] = $sAppUid; + $context['request'] = $nameFiles; + Bootstrap::registerMonolog('DeleteCases', 200, 'Delete Case', $context); + return $result; } catch (exception $e) { throw ($e); @@ -4543,11 +4544,14 @@ class Cases $appDelay = new AppDelay(); $appDelay->create($newData); - //update searchindex + //Update searchindex if ($this->appSolr != null) { $this->appSolr->updateApplicationSearchIndex($appUid); } + //Execute trigger + $this->getExecuteTriggerProcess($appUid, 'REASSIGNED'); + /*----------------------------------********---------------------------------*/ $participated = new ListParticipatedLast(); $participated->remove($newData['APP_UID'], $newUserUid, $delIndex); @@ -4567,9 +4571,7 @@ class Cases $criteriaSet = new Criteria("workflow"); $criteriaSet->add(ListInboxPeer::DEL_INDEX, $newData['DEL_INDEX']); BasePeer::doUpdate($criteriaWhere, $criteriaSet, Propel::getConnection("workflow")); - /*----------------------------------********---------------------------------*/ - $this->getExecuteTriggerProcess($appUid, 'REASSIGNED'); //Delete record of the table LIST_UNASSIGNED $unassigned = new ListUnassigned(); @@ -7139,57 +7141,38 @@ class Cases return false; } + /** + * When the case is deleted will be removed the case from the report tables related + * + * @param string $applicationUid + * + * @return void + * @throws Exception + */ public function reportTableDeleteRecord($applicationUid) { - $criteria1 = new Criteria("workflow"); - - //SELECT - $criteria1->addSelectColumn(ApplicationPeer::PRO_UID); - - //FROM - //WHERE - $criteria1->add(ApplicationPeer::APP_UID, $applicationUid); - - //QUERY - $rsCriteria1 = ApplicationPeer::doSelectRS($criteria1); - $rsCriteria1->setFetchmode(ResultSet::FETCHMODE_ASSOC); - - $rsCriteria1->next(); - $row1 = $rsCriteria1->getRow(); - - $processUid = $row1["PRO_UID"]; - - $criteria2 = new Criteria("workflow"); - - //SELECT - $criteria2->addSelectColumn(AdditionalTablesPeer::ADD_TAB_NAME); - - //FROM - //WHERE - - $criteria2->add(AdditionalTablesPeer::PRO_UID, $processUid); - - //QUERY - $rsCriteria2 = AdditionalTablesPeer::doSelectRS($criteria2); - $rsCriteria2->setFetchmode(ResultSet::FETCHMODE_ASSOC); - - $pmTable = new PmTable(); - - while ($rsCriteria2->next()) { - try { - $row2 = $rsCriteria2->getRow(); - $tableName = $row2["ADD_TAB_NAME"]; - $pmTableName = $pmTable->toCamelCase($tableName); - - //DELETE - require_once(PATH_WORKSPACE . "classes" . PATH_SEP . "$pmTableName.php"); - - $criteria3 = new Criteria("workflow"); - - eval("\$criteria3->add(" . $pmTableName . "Peer::APP_UID, \$applicationUid);"); - eval($pmTableName . "Peer::doDelete(\$criteria3);"); - } catch (Exception $e) { - throw $e; + $app = new Application(); + $applicationFields = $app->Load($applicationUid); + if (!empty($applicationFields["PRO_UID"])) { + $additionalTables = new AdditionalTables(); + $listTables = $additionalTables->getReportTables($applicationFields["PRO_UID"]); + $pmTable = new PmTable(); + foreach ($listTables as $row) { + try { + $tableName = $row["ADD_TAB_NAME"]; + $pmTableName = $pmTable->toCamelCase($tableName); + require_once(PATH_WORKSPACE . 'classes' . PATH_SEP . $pmTableName . '.php'); + $criteria = new Criteria("workflow"); + $pmTablePeer = $pmTableName . 'Peer'; + $criteria->add($pmTablePeer::APP_UID, $applicationUid); + $pmTablePeer::doDelete($criteria); + } catch (Exception $e) { + $context = Bootstrap::getDefaultContextLog(); + $context['appUid'] = $applicationUid; + $context['proUid'] = $applicationFields["PRO_UID"]; + $context['reportTable'] = $tableName; + Bootstrap::registerMonolog('DeleteCases', 400, $e->getMessage(), $context); + } } } } diff --git a/workflow/engine/classes/Processes.php b/workflow/engine/classes/Processes.php index 24c4ad523..c81813e60 100644 --- a/workflow/engine/classes/Processes.php +++ b/workflow/engine/classes/Processes.php @@ -1768,25 +1768,33 @@ class Processes /** * Create "Process User" records * - * @param array $arrayData Data to create + * @param array $arrayData * - * return void + * @return void + * @throws Exception */ public function createProcessUser(array $arrayData) { try { - $processUser = new ProcessUser(); - - foreach ($arrayData as $value) { - $record = $value; - - if ($processUser->Exists($record["PU_UID"])) { - $result = $processUser->remove($record["PU_UID"]); - } - - $result = $processUser->create($record); + $con = Propel::getConnection(ProcessUserPeer::DATABASE_NAME); + $con->begin(); + foreach ($arrayData as $row) { + //Prepare the delete + $criteria = new Criteria(ProcessUserPeer::DATABASE_NAME); + $criteria->addSelectColumn('*'); + $criteria->add(ProcessUserPeer::PU_UID, $row['PU_UID']); + BasePeer::doDelete($criteria, $con); + //Prepare the insert + $criteria = new Criteria(ProcessUserPeer::DATABASE_NAME); + $criteria->add(ProcessUserPeer::PU_UID, $row['PU_UID']); + $criteria->add(ProcessUserPeer::PRO_UID, $row['PRO_UID']); + $criteria->add(ProcessUserPeer::USR_UID, $row['USR_UID']); + $criteria->add(ProcessUserPeer::PU_TYPE, $row['PU_TYPE']); + BasePeer::doInsert($criteria, $con); } + $con->commit(); } catch (Exception $e) { + $con->rollback(); throw $e; } } @@ -1832,23 +1840,41 @@ class Processes /** * Create "Process Variables" records * - * @param array $arrayData Data to create + * @param array $arrayData * - * return void + * @return void + * @throws Exception */ public function createProcessVariables(array $arrayData) { try { - foreach ($arrayData as $value) { - $processVariables = new ProcessVariables(); - $record = $value; - - if ($processVariables->Exists($record["VAR_UID"])) { - $result = $processVariables->remove($record["VAR_UID"]); - } - $result = $processVariables->create($record); + $con = Propel::getConnection(ProcessVariablesPeer::DATABASE_NAME); + $con->begin(); + foreach ($arrayData as $row) { + //Prepare the delete + $criteria = new Criteria(ProcessVariablesPeer::DATABASE_NAME); + $criteria->addSelectColumn('*'); + $criteria->add(ProcessVariablesPeer::VAR_UID, $row['VAR_UID']); + BasePeer::doDelete($criteria, $con); + //Prepare the insert + $criteria = new Criteria(ProcessVariablesPeer::DATABASE_NAME); + $criteria->add(ProcessVariablesPeer::VAR_UID, $row['VAR_UID']); + $criteria->add(ProcessVariablesPeer::PRJ_UID, $row['PRJ_UID']); + $criteria->add(ProcessVariablesPeer::VAR_NAME, $row['VAR_NAME']); + $criteria->add(ProcessVariablesPeer::VAR_FIELD_TYPE, $row['VAR_FIELD_TYPE']); + $criteria->add(ProcessVariablesPeer::VAR_FIELD_SIZE, $row['VAR_FIELD_SIZE']); + $criteria->add(ProcessVariablesPeer::VAR_LABEL, $row['VAR_LABEL']); + $criteria->add(ProcessVariablesPeer::VAR_DBCONNECTION, $row['VAR_DBCONNECTION']); + $criteria->add(ProcessVariablesPeer::VAR_SQL, $row['VAR_SQL']); + $criteria->add(ProcessVariablesPeer::VAR_NULL, $row['VAR_NULL']); + $criteria->add(ProcessVariablesPeer::VAR_DEFAULT, $row['VAR_DEFAULT']); + $criteria->add(ProcessVariablesPeer::VAR_ACCEPTED_VALUES, $row['VAR_ACCEPTED_VALUES']); + $criteria->add(ProcessVariablesPeer::INP_DOC_UID, $row['INP_DOC_UID']); + BasePeer::doInsert($criteria, $con); } + $con->commit(); } catch (Exception $e) { + $con->rollback(); throw $e; } } @@ -1895,47 +1921,86 @@ class Processes /** * Gets Input Documents Rows from aProcess. * - * @param $sProUid string. - * @return void + * @param string $proUid + * + * @return array + * @throws Exception */ - public function getInputRows($sProUid) + public function getInputRows($proUid) { try { - $aInput = array(); - $oCriteria = new Criteria('workflow'); - $oCriteria->add(InputDocumentPeer::PRO_UID, $sProUid); - $oDataset = InputDocumentPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); - while ($aRow = $oDataset->getRow()) { - $oInput = new InputDocument(); - $aInput[] = $oInput->load($aRow['INP_DOC_UID']); - $oDataset->next(); + $inputList = []; + $criteria = new Criteria('workflow'); + $criteria->add(InputDocumentPeer::PRO_UID, $proUid); + $dataset = InputDocumentPeer::doSelectRS($criteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $dataset->next(); + while ($row = $dataset->getRow()) { + $input = new InputDocument(); + $infoInput = $input->load($row['INP_DOC_UID']); + unset($infoInput['INP_DOC_ID']); + $inputList[] = $infoInput; + $dataset->next(); } - return $aInput; - } catch (Exception $oError) { - throw ($oError); + + return $inputList; + } catch (Exception $error) { + throw ($error); } } /** - * Create Input Documents Rows from an array, removing those Objects - * with the same UID, and recreaiting the records from the array data. + * Create Input Documents + * + * @param array $input * - * @param $aInput array. * @return void + * @throws Exception */ - public function createInputRows($aInput) + public function createInputRows($input) { - foreach ($aInput as $key => $row) { - $oInput = new InputDocument(); - //unset ($row['TAS_UID']); - if ($oInput->InputExists($row['INP_DOC_UID'])) { - $oInput->remove($row['INP_DOC_UID']); + try { + $con = Propel::getConnection(InputDocumentPeer::DATABASE_NAME); + $con->begin(); + foreach ($input as $key => $row) { + //Prepare the delete + $criteria = new Criteria(InputDocumentPeer::DATABASE_NAME); + $criteria->addSelectColumn('*'); + $criteria->add(InputDocumentPeer::INP_DOC_UID, $row['INP_DOC_UID']); + //Get the INP_DOC_ID column + $dataSet = BasePeer::doSelect($criteria, $con); + $dataSet->setFetchmode(ResultSet::FETCHMODE_ASSOC); + if ($dataSet->next()) { + $inputInfo = $dataSet->getRow(); + $row['INP_DOC_ID'] = $inputInfo['INP_DOC_ID']; + } else { + $row['INP_DOC_ID'] = null; + } + BasePeer::doDelete($criteria, $con); + //Prepare the insert + $criteria = new Criteria(InputDocumentPeer::DATABASE_NAME); + $criteria->add(InputDocumentPeer::INP_DOC_ID, $row['INP_DOC_ID']); + $criteria->add(InputDocumentPeer::INP_DOC_UID, $row['INP_DOC_UID']); + $criteria->add(InputDocumentPeer::PRO_UID, $row['PRO_UID']); + $criteria->add(InputDocumentPeer::INP_DOC_TITLE, $row['INP_DOC_TITLE']); + $criteria->add(InputDocumentPeer::INP_DOC_DESCRIPTION, $row['INP_DOC_DESCRIPTION']); + $criteria->add(InputDocumentPeer::INP_DOC_FORM_NEEDED, $row['INP_DOC_FORM_NEEDED']); + $criteria->add(InputDocumentPeer::INP_DOC_ORIGINAL, $row['INP_DOC_ORIGINAL']); + $criteria->add(InputDocumentPeer::INP_DOC_PUBLISHED, $row['INP_DOC_PUBLISHED']); + $criteria->add(InputDocumentPeer::INP_DOC_VERSIONING, $row['INP_DOC_VERSIONING']); + $criteria->add(InputDocumentPeer::INP_DOC_DESTINATION_PATH, $row['INP_DOC_DESTINATION_PATH']); + $criteria->add(InputDocumentPeer::INP_DOC_TAGS, $row['INP_DOC_TAGS']); + $criteria->add(InputDocumentPeer::INP_DOC_TYPE_FILE, $row['INP_DOC_TYPE_FILE']); + $criteria->add(InputDocumentPeer::INP_DOC_MAX_FILESIZE, $row['INP_DOC_MAX_FILESIZE']); + $criteria->add(InputDocumentPeer::INP_DOC_MAX_FILESIZE_UNIT, $row['INP_DOC_MAX_FILESIZE_UNIT']); + BasePeer::doInsert($criteria, $con); } - $res = $oInput->create($row); + $con->commit(); + } catch (Exception $e) { + $con->rollback(); + throw $e; } - return; + } /** @@ -2029,47 +2094,96 @@ class Processes /** * Gets the Output Documents Rows from a Process. * - * @param $sProUid string. - * @return $aOutput array + * @param string $proUid + * + * @return array + * @throws Exception */ - public function getOutputRows($sProUid) + public function getOutputRows($proUid) { try { - $aOutput = array(); - $oCriteria = new Criteria('workflow'); - $oCriteria->add(OutputDocumentPeer::PRO_UID, $sProUid); - $oDataset = OutputDocumentPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); - while ($aRow = $oDataset->getRow()) { - $oOutput = new OutputDocument(); - $aOutput[] = $oOutput->Load($aRow['OUT_DOC_UID']); - $oDataset->next(); + $outputList = []; + $criteria = new Criteria('workflow'); + $criteria->add(OutputDocumentPeer::PRO_UID, $proUid); + $dataset = OutputDocumentPeer::doSelectRS($criteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $dataset->next(); + while ($row = $dataset->getRow()) { + $output = new OutputDocument(); + $infoOutput = $output->Load($row['OUT_DOC_UID']); + unset($infoOutput['OUT_DOC_ID']); + $outputList[] = $infoOutput; + $dataset->next(); } - return $aOutput; - } catch (Exception $oError) { - throw ($oError); + + return $outputList; + } catch (Exception $error) { + throw ($error); } } /** - * Create Input Documents Rows from an array, removing those Objects - * with the same UID, and recreaiting the records from the array data. + * Create Input Documents + * + * @param array $output * - * @param $aOutput array. * @return void + * @throws Exception */ - public function createOutputRows($aOutput) + public function createOutputRows($output) { - foreach ($aOutput as $key => $row) { - $oOutput = new OutputDocument(); - //unset ($row['TAS_UID']); - if ($oOutput->OutputExists($row['OUT_DOC_UID'])) { - $oOutput->remove($row['OUT_DOC_UID']); + try { + $con = Propel::getConnection(OutputDocumentPeer::DATABASE_NAME); + $con->begin(); + foreach ($output as $key => $row) { + //Prepare the delete + $criteria = new Criteria(OutputDocumentPeer::DATABASE_NAME); + $criteria->addSelectColumn('*'); + $criteria->add(OutputDocumentPeer::OUT_DOC_UID, $row['OUT_DOC_UID']); + //Get the OUT_DOC_ID column + $dataSet = BasePeer::doSelect($criteria, $con); + $dataSet->setFetchmode(ResultSet::FETCHMODE_ASSOC); + if ($dataSet->next()) { + $outputInfo = $dataSet->getRow(); + $row['OUT_DOC_ID'] = $outputInfo['OUT_DOC_ID']; + } else { + $row['OUT_DOC_ID'] = null; + } + BasePeer::doDelete($criteria, $con); + //Prepare the insert + $criteria = new Criteria(OutputDocumentPeer::DATABASE_NAME); + $criteria->add(OutputDocumentPeer::OUT_DOC_ID, $row['OUT_DOC_ID']); + $criteria->add(OutputDocumentPeer::OUT_DOC_UID, $row['OUT_DOC_UID']); + $criteria->add(OutputDocumentPeer::OUT_DOC_TITLE, $row['OUT_DOC_TITLE']); + $criteria->add(OutputDocumentPeer::OUT_DOC_DESCRIPTION, $row['OUT_DOC_DESCRIPTION']); + $criteria->add(OutputDocumentPeer::OUT_DOC_FILENAME, $row['OUT_DOC_FILENAME']); + $criteria->add(OutputDocumentPeer::OUT_DOC_TEMPLATE, $row['OUT_DOC_TEMPLATE']); + $criteria->add(OutputDocumentPeer::PRO_UID, $row['PRO_UID']); + $criteria->add(OutputDocumentPeer::OUT_DOC_REPORT_GENERATOR, $row['OUT_DOC_REPORT_GENERATOR']); + $criteria->add(OutputDocumentPeer::OUT_DOC_LANDSCAPE, $row['OUT_DOC_LANDSCAPE']); + $criteria->add(OutputDocumentPeer::OUT_DOC_MEDIA, $row['OUT_DOC_MEDIA']); + $criteria->add(OutputDocumentPeer::OUT_DOC_LEFT_MARGIN, $row['OUT_DOC_LEFT_MARGIN']); + $criteria->add(OutputDocumentPeer::OUT_DOC_RIGHT_MARGIN, $row['OUT_DOC_RIGHT_MARGIN']); + $criteria->add(OutputDocumentPeer::OUT_DOC_TOP_MARGIN, $row['OUT_DOC_TOP_MARGIN']); + $criteria->add(OutputDocumentPeer::OUT_DOC_BOTTOM_MARGIN, $row['OUT_DOC_BOTTOM_MARGIN']); + $criteria->add(OutputDocumentPeer::OUT_DOC_GENERATE, $row['OUT_DOC_GENERATE']); + $criteria->add(OutputDocumentPeer::OUT_DOC_CURRENT_REVISION, $row['OUT_DOC_CURRENT_REVISION']); + $criteria->add(OutputDocumentPeer::OUT_DOC_FIELD_MAPPING, $row['OUT_DOC_FIELD_MAPPING']); + $criteria->add(OutputDocumentPeer::OUT_DOC_VERSIONING, $row['OUT_DOC_VERSIONING']); + $criteria->add(OutputDocumentPeer::OUT_DOC_DESTINATION_PATH, $row['OUT_DOC_DESTINATION_PATH']); + $criteria->add(OutputDocumentPeer::OUT_DOC_TAGS, $row['OUT_DOC_TAGS']); + $criteria->add(OutputDocumentPeer::OUT_DOC_PDF_SECURITY_ENABLED, $row['OUT_DOC_PDF_SECURITY_ENABLED']); + $criteria->add(OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OPEN_PASSWORD, $row['OUT_DOC_PDF_SECURITY_OPEN_PASSWORD']); + $criteria->add(OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OWNER_PASSWORD, $row['OUT_DOC_PDF_SECURITY_OWNER_PASSWORD']); + $criteria->add(OutputDocumentPeer::OUT_DOC_PDF_SECURITY_PERMISSIONS, $row['OUT_DOC_PDF_SECURITY_PERMISSIONS']); + $criteria->add(OutputDocumentPeer::OUT_DOC_OPEN_TYPE, $row['OUT_DOC_OPEN_TYPE']); + BasePeer::doInsert($criteria, $con); } - $res = $oOutput->create($row); + $con->commit(); + } catch (Exception $e) { + $con->rollback(); + throw $e; } - return; } /** @@ -2665,37 +2779,75 @@ class Processes /** * Create Step Rows from a Process * - * @param $aStep array. + * @param array $step + * * @return void. + * @throws Exception */ - public function createStepRows($aStep) + public function createStepRows($step) { - foreach ($aStep as $key => $row) { - $oStep = new Step(); - if (isset($row['STEP_UID'])) { - if ($oStep->StepExists($row['STEP_UID'])) { - $oStep->remove($row['STEP_UID']); + try { + $con = Propel::getConnection(StepPeer::DATABASE_NAME); + $con->begin(); + foreach ($step as $key => $row) { + if (isset($row['STEP_UID'])) { + //Prepare the delete + $criteria = new Criteria(StepPeer::DATABASE_NAME); + $criteria->addSelectColumn('*'); + $criteria->add(StepPeer::STEP_UID, $row['STEP_UID']); + BasePeer::doDelete($criteria, $con); + //Prepare the insert + $criteria = new Criteria(StepPeer::DATABASE_NAME); + $criteria->add(StepPeer::STEP_UID, $row['STEP_UID']); + $criteria->add(StepPeer::PRO_UID, $row['PRO_UID']); + $criteria->add(StepPeer::TAS_UID, $row['TAS_UID']); + $criteria->add(StepPeer::STEP_TYPE_OBJ, $row['STEP_TYPE_OBJ']); + $criteria->add(StepPeer::STEP_UID_OBJ, $row['STEP_UID_OBJ']); + $criteria->add(StepPeer::STEP_CONDITION, $row['STEP_CONDITION']); + $criteria->add(StepPeer::STEP_POSITION, $row['STEP_POSITION']); + $criteria->add(StepPeer::STEP_MODE, $row['STEP_MODE']); + BasePeer::doInsert($criteria, $con); } - $res = $oStep->create($row); } + $con->commit(); + } catch (Exception $e) { + $con->rollback(); + throw $e; } - return; } /** * Create Step Supervisor Rows for a Process from an array of data * - * @param $aStepSupervisor array. + * @param array $stepSupervisor + * * @return void. + * @throws Exception */ - public function createStepSupervisorRows($aStepSupervisor) + public function createStepSupervisorRows($stepSupervisor) { - foreach ($aStepSupervisor as $key => $row) { - $oStepSupervisor = new StepSupervisor(); - if ($oStepSupervisor->Exists($row['STEP_UID'])) { - $oStepSupervisor->remove($row['STEP_UID']); + try { + $con = Propel::getConnection(StepSupervisorPeer::DATABASE_NAME); + $con->begin(); + foreach ($stepSupervisor as $key => $row) { + //Prepare the delete + $criteria = new Criteria(StepSupervisorPeer::DATABASE_NAME); + $criteria->addSelectColumn('*'); + $criteria->add(StepSupervisorPeer::STEP_UID, $row['STEP_UID']); + BasePeer::doDelete($criteria, $con); + //Prepare the insert + $criteria = new Criteria(StepSupervisorPeer::DATABASE_NAME); + $criteria->add(StepSupervisorPeer::STEP_UID, $row['STEP_UID']); + $criteria->add(StepSupervisorPeer::PRO_UID, $row['PRO_UID']); + $criteria->add(StepSupervisorPeer::STEP_TYPE_OBJ, $row['STEP_TYPE_OBJ']); + $criteria->add(StepSupervisorPeer::STEP_UID_OBJ, $row['STEP_UID_OBJ']); + $criteria->add(StepSupervisorPeer::STEP_POSITION, $row['STEP_POSITION']); + BasePeer::doInsert($criteria, $con); } - $oStepSupervisor->create($row); + $con->commit(); + } catch (Exception $e) { + $con->rollback(); + throw $e; } } @@ -2764,26 +2916,31 @@ class Processes /** * Get Dynaform Rows from a Process * - * @param string $sProUid - * @return $aDynaform array + * @param string $proUid + * + * @return array + * @throws Exception */ - public function getDynaformRows($sProUid) + public function getDynaformRows($proUid) { try { - $aDynaform = array(); - $oCriteria = new Criteria('workflow'); - $oCriteria->add(DynaformPeer::PRO_UID, $sProUid); - $oDataset = DynaformPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); - while ($aRow = $oDataset->getRow()) { - $oDynaform = new Dynaform(); - $aDynaform[] = $oDynaform->Load($aRow['DYN_UID']); - $oDataset->next(); + $dynaformList = []; + $criteria = new Criteria('workflow'); + $criteria->add(DynaformPeer::PRO_UID, $proUid); + $dataset = DynaformPeer::doSelectRS($criteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $dataset->next(); + while ($row = $dataset->getRow()) { + $dynaform = new Dynaform(); + $infoDyn = $dynaform->Load($row['DYN_UID']); + unset($infoDyn['DYN_ID']); + $dynaformList[] = $infoDyn; + $dataset->next(); } - return $aDynaform; - } catch (Exception $oError) { - throw ($oError); + + return $dynaformList; + } catch (Exception $error) { + throw ($error); } } @@ -2906,22 +3063,53 @@ class Processes } /** - * Create Dynaform Rows for a Process form an array + * Create dynaforms for a process + * + * @param array $dynaforms * - * @param array $aDynaform * @return void + * @throws Exception */ - public function createDynaformRows($aDynaform) + public function createDynaformRows($dynaforms) { - foreach ($aDynaform as $key => $row) { - $oDynaform = new Dynaform(); - //unset ($row['TAS_UID']); - if ($oDynaform->exists($row['DYN_UID'])) { - $oDynaform->remove($row['DYN_UID']); + try { + $con = Propel::getConnection(DynaformPeer::DATABASE_NAME); + $con->begin(); + foreach ($dynaforms as $key => $row) { + //Prepare the delete + $criteria = new Criteria(DynaformPeer::DATABASE_NAME); + $criteria->addSelectColumn('*'); + $criteria->add(DynaformPeer::DYN_UID, $row['DYN_UID']); + //Get the DYN_ID column + $dataSet = BasePeer::doSelect($criteria, $con); + $dataSet->setFetchmode(ResultSet::FETCHMODE_ASSOC); + if ($dataSet->next()) { + $dynInfo = $dataSet->getRow(); + $row['DYN_ID'] = $dynInfo['DYN_ID']; + } else { + $row['DYN_ID'] = null; + } + BasePeer::doDelete($criteria, $con); + //Prepare the insert + $criteria = new Criteria(DynaformPeer::DATABASE_NAME); + $criteria->add(DynaformPeer::DYN_ID, $row['DYN_ID']); + $criteria->add(DynaformPeer::DYN_UID, $row['DYN_UID']); + $criteria->add(DynaformPeer::DYN_TITLE, $row['DYN_TITLE']); + $criteria->add(DynaformPeer::DYN_DESCRIPTION, $row['DYN_DESCRIPTION']); + $criteria->add(DynaformPeer::PRO_UID, $row['PRO_UID']); + $criteria->add(DynaformPeer::DYN_TYPE, $row['DYN_TYPE']); + $criteria->add(DynaformPeer::DYN_FILENAME, $row['DYN_FILENAME']); + $criteria->add(DynaformPeer::DYN_CONTENT, $row['DYN_CONTENT']); + $criteria->add(DynaformPeer::DYN_LABEL, $row['DYN_LABEL']); + $criteria->add(DynaformPeer::DYN_VERSION, $row['DYN_VERSION']); + $criteria->add(DynaformPeer::DYN_UPDATE_DATE, $row['DYN_UPDATE_DATE']); + BasePeer::doInsert($criteria, $con); } - $res = $oDynaform->create($row); + $con->commit(); + } catch (Exception $e) { + $con->rollback(); + throw $e; } - return; } /** @@ -3035,20 +3223,38 @@ class Processes /** * Create Step Trigger Rows for a Process form an array * - * @param array $aTrigger + * @param array $trigger + * * @return void + * @throws Exception */ - public function createTriggerRows($aTrigger) + public function createTriggerRows($trigger) { - foreach ($aTrigger as $key => $row) { - $oTrigger = new Triggers(); - //unset ($row['TAS_UID']); - if ($oTrigger->TriggerExists($row['TRI_UID'])) { - $oTrigger->remove($row['TRI_UID']); + try { + $con = Propel::getConnection(TriggersPeer::DATABASE_NAME); + $con->begin(); + foreach ($trigger as $key => $row) { + //Prepare the delete + $criteria = new Criteria(TriggersPeer::DATABASE_NAME); + $criteria->addSelectColumn('*'); + $criteria->add(TriggersPeer::TRI_UID, $row['TRI_UID']); + BasePeer::doDelete($criteria, $con); + //Prepare the insert + $criteria = new Criteria(TriggersPeer::DATABASE_NAME); + $criteria->add(TriggersPeer::TRI_UID, $row['TRI_UID']); + $criteria->add(TriggersPeer::TRI_TITLE, $row['TRI_TITLE']); + $criteria->add(TriggersPeer::TRI_DESCRIPTION, $row['TRI_DESCRIPTION']); + $criteria->add(TriggersPeer::PRO_UID, $row['PRO_UID']); + $criteria->add(TriggersPeer::TRI_TYPE, $row['TRI_TYPE']); + $criteria->add(TriggersPeer::TRI_WEBBOT, $row['TRI_WEBBOT']); + $criteria->add(TriggersPeer::TRI_PARAM, $row['TRI_PARAM']); + BasePeer::doInsert($criteria, $con); } - $res = $oTrigger->create($row); + $con->commit(); + } catch (Exception $e) { + $con->rollback(); + throw $e; } - return; } /** @@ -3736,21 +3942,40 @@ class Processes /** * Get Task User Rows from an array of data * - * @param array $aTaskUser - * @return array $aStepTrigger + * @param array $taskUser + * + * @return void + * @throws Exception */ - public function createTaskUserRows($aTaskUser) + public function createTaskUserRows($taskUser) { - if (is_array($aTaskUser)) { - foreach ($aTaskUser as $key => $row) { - $oTaskUser = new TaskUser(); - if ($oTaskUser->TaskUserExists($row['TAS_UID'], $row['USR_UID'], $row['TU_TYPE'], $row['TU_RELATION'])) { - $oTaskUser->remove($row['TAS_UID'], $row['USR_UID'], $row['TU_TYPE'], $row['TU_RELATION']); + try { + if (is_array($taskUser)) { + $con = Propel::getConnection(TaskUserPeer::DATABASE_NAME); + $con->begin(); + foreach ($taskUser as $key => $row) { + //Prepare the delete + $criteria = new Criteria(TaskUserPeer::DATABASE_NAME); + $criteria->addSelectColumn('*'); + $criteria->add(TaskUserPeer::TAS_UID, $row['TAS_UID']); + $criteria->add(TaskUserPeer::USR_UID, $row['USR_UID']); + $criteria->add(TaskUserPeer::TU_TYPE, $row['TU_TYPE']); + $criteria->add(TaskUserPeer::TU_RELATION, $row['TU_RELATION']); + $dataSet = BasePeer::doSelect($criteria, $con); + if (!$dataSet->next()) { + /** The validation added in method TaskUser->create is not required, + * because in the current method only assigned GROUPS are present. + * if (RBAC::isGuestUserUid($row['USR_UID']) && !$bmWebEntry->isTaskAWebEntry($row['TAS_UID'])) {... + */ + BasePeer::doInsert($criteria, $con, false); + } } - $res = $oTaskUser->create($row); + $con->commit(); } + } catch (Exception $e) { + $con->rollback(); + throw $e; } - return; } /** @@ -3794,21 +4019,42 @@ class Processes * @param array $group * * @return void + * @throws Exception */ public function createGroupRow($group) { - foreach ($group as $key => $row) { - $groupInfo = []; - $groupWf = new Groupwf(); - if ($groupWf->GroupwfExists($row['GRP_UID'])) { - $groupInfo = $groupWf->Load($row['GRP_UID']); - $groupWf->remove($row['GRP_UID']); + try { + $con = Propel::getConnection(GroupwfPeer::DATABASE_NAME); + $con->begin(); + foreach ($group as $key => $row) { + //Prepare the delete + $criteria = new Criteria(GroupwfPeer::DATABASE_NAME); + $criteria->addSelectColumn('*'); + $criteria->add(GroupwfPeer::GRP_UID, $row['GRP_UID']); + //Get the GRP_ID column + $dataSet = BasePeer::doSelect($criteria, $con); + $dataSet->setFetchmode(ResultSet::FETCHMODE_ASSOC); + if ($dataSet->next()) { + $groupInfo = $dataSet->getRow(); + $row['GRP_ID'] = $groupInfo['GRP_ID']; + } else { + $row['GRP_ID'] = null; + } + BasePeer::doDelete($criteria, $con); + //Prepare the insert + $criteria = new Criteria(GroupwfPeer::DATABASE_NAME); + $criteria->add(GroupwfPeer::GRP_ID, $row['GRP_ID']); + $criteria->add(GroupwfPeer::GRP_UID, $row['GRP_UID']); + $criteria->add(GroupwfPeer::GRP_TITLE, $row['GRP_TITLE']); + $criteria->add(GroupwfPeer::GRP_STATUS, $row['GRP_STATUS']); + $criteria->add(GroupwfPeer::GRP_LDAP_DN, $row['GRP_LDAP_DN']); + $criteria->add(GroupwfPeer::GRP_UX, $row['GRP_UX']); + BasePeer::doInsert($criteria, $con); } - //We will to keep the GRP_ID - if (!empty($groupInfo['GRP_ID'])) { - $row['GRP_ID'] = $groupInfo['GRP_ID']; - } - $res = $groupWf->create($row); + $con->commit(); + } catch (Exception $e) { + $con->rollback(); + throw $e; } } @@ -4212,7 +4458,8 @@ class Processes * @param string $processUid Unique id of Process * @param array $arrayData Data * - * return void + * @return void + * @throws Exception */ public function createActionsByEmail($processUid, array $arrayData) { @@ -4784,45 +5031,35 @@ class Processes /** * function checkExistingGroups * checkExistingGroups check if any of the groups listed in the parameter - * array exist and wich are those, that is the result $sFilteredGroups array. + * array exist and which are those, that is the result $sFilteredGroups array. * - * @author gustavo cruz gustavo-at-colosa.com - * @param $sGroupList array of a group list - * @return $existingGroupList array of existing groups or null + * @param array $groupList, array of a group list + * @return array|null, array of existing groups or null */ - public function checkExistingGroups($sGroupList) + public function checkExistingGroups($groupList) { - $aGroupwf = array(); - $oCriteria = new Criteria('workflow'); - $oCriteria->addSelectColumn(GroupwfPeer::GRP_UID); - $oCriteria->addSelectColumn(GroupwfPeer::GRP_TITLE); - $oDataset = GroupwfPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); - while ($aRow = $oDataset->getRow()) { - $aGroupwf[] = $aRow; - $oDataset->next(); - } - //check if any group name exists in the dbase - if (is_array($sGroupList)) { - foreach ($aGroupwf as $groupBase) { - foreach ($sGroupList as $group) { - if ($groupBase['GRP_TITLE'] == $group['GRP_TITLE'] && $groupBase['GRP_UID'] != $group['GRP_UID']) { - $oPro = GroupwfPeer::retrieveByPk( $group['GRP_UID'] ); - if(is_object( $oPro ) && get_class( $oPro ) == 'Groupwf') { - $group['GRP_UID'] = G::generateUniqueID(); - } - $existingGroupList[] = $group; + $existingGroupList = []; + $criteria = new Criteria('workflow'); + $criteria->addSelectColumn(GroupwfPeer::GRP_UID); + $criteria->addSelectColumn(GroupwfPeer::GRP_TITLE); + $dataset = GroupwfPeer::doSelectRS($criteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $dataset->next(); + while ($row = $dataset->getRow()) { + foreach ($groupList as $group) { + //Check if any group name exists in the database + if ($row['GRP_TITLE'] === $group['GRP_TITLE'] && $row['GRP_UID'] !== $group['GRP_UID']) { + $groupWf = GroupwfPeer::retrieveByPk($group['GRP_UID']); + if (is_object($groupWf) && get_class($groupWf) == 'Groupwf') { + $group['GRP_UID'] = G::generateUniqueID(); } + $existingGroupList[] = $group; } } + $dataset->next(); } - //return $sGroupList; - if (isset($existingGroupList)) { - return $existingGroupList; - } else { - return null; - } + + return !empty($existingGroupList) ? $existingGroupList : null; } /** @@ -5499,54 +5736,21 @@ class Processes $this->createProcessPropertiesFromData($oData); -// $this->createLaneRows( $oData->lanes ); -// -// -// if (isset( $oData->gateways )) { -// $this->createGatewayRows( $oData->gateways ); -// } -// $this->createDynaformRows( $oData->dynaforms ); -// $this->createInputRows( $oData->inputs ); -// $this->createOutputRows( $oData->outputs ); -// $this->createStepRows( $oData->steps ); -// $this->createStepSupervisorRows( isset( $oData->stepSupervisor ) ? $oData->stepSupervisor : array () ); -// $this->createTriggerRows( $oData->triggers ); -// $this->createStepTriggerRows( $oData->steptriggers ); -// $this->createTaskUserRows( $oData->taskusers ); -// $this->createGroupRow( $oData->groupwfs ); -// $this->createDBConnectionsRows( isset( $oData->dbconnections ) ? $oData->dbconnections : array () ); -// $this->createReportTables( isset( $oData->reportTables ) ? $oData->reportTables : array (), isset( $oData->reportTablesVars ) ? $oData->reportTablesVars : array () ); -// $this->createSubProcessRows( isset( $oData->subProcess ) ? $oData->subProcess : array () ); -// $this->createCaseTrackerRows( isset( $oData->caseTracker ) ? $oData->caseTracker : array () ); -// $this->createCaseTrackerObjectRows( isset( $oData->caseTrackerObject ) ? $oData->caseTrackerObject : array () ); -// $this->createObjectPermissionsRows( isset( $oData->objectPermissions ) ? $oData->objectPermissions : array () ); -// $this->createStageRows( isset( $oData->stage ) ? $oData->stage : array () ); -// -// $this->createFieldCondition( isset( $oData->fieldCondition ) ? $oData->fieldCondition : array (), $oData->dynaforms ); -// -// // Create before to createRouteRows for avoid duplicates -// $this->createEventRows( isset( $oData->event ) ? $oData->event : array () ); -// -// $this->createCaseSchedulerRows( isset( $oData->caseScheduler ) ? $oData->caseScheduler : array () ); -// -// //Create data related to Configuration table -// $this->createTaskExtraPropertiesRows( isset( $oData->taskExtraProperties ) ? $oData->taskExtraProperties : array () ); - - // and finally create the files, dynaforms (xml and html), emailTemplates and Public files $this->createFiles($oData, $pmFilename); } + /** + * This function creates a new Process, defined in the object $oData + * + * @param object $oData + * + * @return void + */ public function createProcessPropertiesFromData($oData) { $arrayProcessData = $oData->process; - - // (*) Creating process dependencies - // creating the process category $this->createProcessCategoryRow(isset($oData->processCategory) ? $oData->processCategory : null); - $this->createLaneRows($oData->lanes); - - if (isset($oData->gateways)) { $this->createGatewayRows($oData->gateways); } @@ -5557,8 +5761,8 @@ class Processes $this->createStepSupervisorRows(isset($oData->stepSupervisor) ? $oData->stepSupervisor : array()); $this->createTriggerRows($oData->triggers); $this->createStepTriggerRows($oData->steptriggers); - $this->createTaskUserRows($oData->taskusers); $this->createGroupRow($oData->groupwfs); + $this->createTaskUserRows($oData->taskusers); $this->createDBConnectionsRows(isset($oData->dbconnections) ? $oData->dbconnections : array()); $this->createReportTables(isset($oData->reportTables) ? $oData->reportTables : array(), isset($oData->reportTablesVars) ? $oData->reportTablesVars : array()); $this->createSubProcessRows(isset($oData->subProcess) ? $oData->subProcess : array()); @@ -5566,17 +5770,14 @@ class Processes $this->createCaseTrackerObjectRows(isset($oData->caseTrackerObject) ? $oData->caseTrackerObject : array()); $this->createObjectPermissionsRows(isset($oData->objectPermissions) ? $oData->objectPermissions : array()); $this->createStageRows(isset($oData->stage) ? $oData->stage : array()); - $this->createFieldCondition(isset($oData->fieldCondition) ? $oData->fieldCondition : array(), $oData->dynaforms); // Create before to createRouteRows for avoid duplicates $this->createEventRows(isset($oData->event) ? $oData->event : array()); - $this->createCaseSchedulerRows(isset($oData->caseScheduler) ? $oData->caseScheduler : array()); //Create data related to Configuration table $this->createTaskExtraPropertiesRows(isset($oData->taskExtraProperties) ? $oData->taskExtraProperties : array()); - $this->createProcessUser((isset($oData->processUser)) ? $oData->processUser : array()); $this->createProcessVariables((isset($oData->processVariables)) ? $oData->processVariables : array()); $this->createWebEntry($arrayProcessData["PRO_UID"], $arrayProcessData["PRO_CREATE_USER"], (isset($oData->webEntry)) ? $oData->webEntry : array()); @@ -5715,10 +5916,12 @@ class Processes } /** - * this function creates a new Process, defined in the object $oData + * This function creates a new Process, defined in the object $oData * - * @param string $sProUid - * @return boolean + * @param object $oData + * @param string $pmFilename + * + * @return void */ public function updateProcessFromData($oData, $pmFilename) { @@ -5736,8 +5939,8 @@ class Processes $this->createStepSupervisorRows($oData->stepSupervisor); $this->createTriggerRows($oData->triggers); $this->createStepTriggerRows($oData->steptriggers); - $this->createTaskUserRows($oData->taskusers); $this->createGroupRow($oData->groupwfs); + $this->createTaskUserRows($oData->taskusers); $this->createDBConnectionsRows($oData->dbconnections); $this->updateReportTables($oData->reportTables, $oData->reportTablesVars); $this->createFiles($oData, $pmFilename); diff --git a/workflow/engine/classes/class.pmFunctions.php b/workflow/engine/classes/class.pmFunctions.php index 0f06b5c6e..95d042a51 100644 --- a/workflow/engine/classes/class.pmFunctions.php +++ b/workflow/engine/classes/class.pmFunctions.php @@ -3215,7 +3215,7 @@ function PMFGetGroupName($grpUid, $lang = SYS_LANG) { * @param string | $text | Text * @param string | $category | Category * @param string | $proUid | ProcessUid - * @param string | $lang | Languaje + * @param string | $lang | Language * @return array */ function PMFGetUidFromText($text, $category, $proUid = null, $lang = SYS_LANG) @@ -3467,14 +3467,28 @@ function PMFCaseLink($caseUid, $workspace = null, $language = null, $skin = null if ($arrayApplicationData === false) { return false; } + $conf = new Configurations(); + $envSkin = defined("SYS_SKIN") ? SYS_SKIN : $conf->getConfiguration('SKIN_CRON', ''); $workspace = (!empty($workspace)) ? $workspace : config("system.workspace"); $language = (!empty($language)) ? $language : SYS_LANG; - $skin = (!empty($skin)) ? $skin : SYS_SKIN; + $skin = (!empty($skin)) ? $skin : $envSkin; $uri = '/sys' . $workspace . '/' . $language . '/' . $skin . '/cases/opencase/' . $caseUid; - //Return - return ((G::is_https()) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $uri; + $envHost = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : SERVER_NAME; + $envProtocol = defined("REQUEST_SCHEME") && REQUEST_SCHEME === "https"; + if (isset($_SERVER['SERVER_PORT'])) { + $envPort = ($_SERVER['SERVER_PORT'] != "80") ? ":" . $_SERVER['SERVER_PORT'] : ""; + } else if (defined('SERVER_PORT')) { + $envPort = (SERVER_PORT . "" != "80") ? ":" . SERVER_PORT : ""; + } else { + $envPort = ""; + } + if (!empty($envPort) && strpos($envHost, $envPort) === false) { + $envHost = $envHost . $envPort; + } + $link = (G::is_https() || $envProtocol ? 'https://' : 'http://') . $envHost . $uri; + return $link; } catch (Exception $e) { throw $e; } diff --git a/workflow/engine/classes/model/AdditionalTables.php b/workflow/engine/classes/model/AdditionalTables.php index a80578e2a..1eefa6356 100644 --- a/workflow/engine/classes/model/AdditionalTables.php +++ b/workflow/engine/classes/model/AdditionalTables.php @@ -56,8 +56,41 @@ function validateType($value, $type) class AdditionalTables extends BaseAdditionalTables { - public $fields = array(); - public $primaryKeys = array(); + const FLD_TYPE_VALUES = [ + 'BIGINT', + 'BOOLEAN', + 'CHAR', + 'DATE', + 'DATETIME', + 'DECIMAL', + 'DOUBLE', + 'FLOAT', + 'INTEGER', + 'LONGVARCHAR', + 'REAL', + 'SMALLINT', + 'TIME', + 'TIMESTAMP', + 'TINYINT', + 'VARCHAR' + ]; + const FLD_TYPE_WITH_AUTOINCREMENT = [ + 'BIGINT', + 'INTEGER', + 'SMALLINT', + 'TINYINT' + ]; + const FLD_TYPE_WITH_SIZE = [ + 'BIGINT', + 'CHAR', + 'DECIMAL', + 'FLOAT', + 'INTEGER', + 'LONGVARCHAR', + 'VARCHAR' + ]; + public $fields = []; + public $primaryKeys = []; /** * Function load @@ -707,85 +740,84 @@ class AdditionalTables extends BaseAdditionalTables */ public function populateReportTable($tableName, $sConnection = 'rp', $type = 'NORMAL', $processUid = '', $gridKey = '', $addTabUid = '') { - require_once "classes/model/Application.php"; - $this->className = $this->getPHPName($tableName); $this->classPeerName = $this->className . 'Peer'; if (!file_exists(PATH_WORKSPACE . 'classes/' . $this->className . '.php')) { - throw new Exception("ERROR: " . PATH_WORKSPACE . 'classes/' . $this->className . '.php' - . " class file doesn't exit!"); + throw new Exception("ERROR: " . PATH_WORKSPACE . 'classes/' . $this->className . '.php' . " class file doesn't exit!"); } require_once PATH_WORKSPACE . 'classes/' . $this->className . '.php'; + //get fields + $fieldTypes = []; + if ($addTabUid != '') { + $criteria = new Criteria('workflow'); + $criteria->add(FieldsPeer::ADD_TAB_UID, $addTabUid); + $dataset = FieldsPeer::doSelectRS($criteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + while ($dataset->next()) { + $row = $dataset->getRow(); + switch ($row['FLD_TYPE']) { + case 'FLOAT': + case 'DOUBLE': + case 'INTEGER': + $fieldTypes[] = array($row['FLD_NAME'] => $row['FLD_TYPE']); + break; + default: + break; + } + } + } + + //remove old applications references + $connection = Propel::getConnection($sConnection); + $statement = $connection->createStatement(); + $sql = "TRUNCATE " . $tableName; + $statement->executeQuery($sql); + + $case = new Cases(); + $context = Bootstrap::getDefaultContextLog(); + //select cases for this Process, ordered by APP_NUMBER - $con = Propel::getConnection($sConnection); - $stmt = $con->createStatement(); $criteria = new Criteria('workflow'); $criteria->add(ApplicationPeer::PRO_UID, $processUid); $criteria->addAscendingOrderByColumn(ApplicationPeer::APP_NUMBER); $dataset = ApplicationPeer::doSelectRS($criteria); $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - while ($dataset->next()) { $row = $dataset->getRow(); - //remove old applications references - $deleteSql = "DELETE FROM $tableName WHERE APP_UID = '" . $row['APP_UID'] . "'"; - $rs = $stmt->executeQuery($deleteSql); - // getting the case data - $caseData = unserialize($row['APP_DATA']); - $fieldTypes = array(); + //getting the case data + $appData = $case->unserializeData($row['APP_DATA']); - if ($addTabUid != '') { - require_once 'classes/model/Fields.php'; - $criteriaField = new Criteria('workflow'); - $criteriaField->add(FieldsPeer::ADD_TAB_UID, $addTabUid); - $datasetField = FieldsPeer::doSelectRS($criteriaField); - $datasetField->setFetchmode(ResultSet::FETCHMODE_ASSOC); - while ($datasetField->next()) { - $rowfield = $datasetField->getRow(); - switch ($rowfield['FLD_TYPE']) { - case 'FLOAT': - case 'DOUBLE': - case 'INTEGER': - $fieldTypes[] = array($rowfield['FLD_NAME'] => $rowfield['FLD_TYPE']); - break; - default: - break; - } + //quick fix, map all empty values as NULL for Database + foreach ($appData as $appDataKey => $appDataValue) { + if (is_array($appDataValue) && count($appDataValue)) { + $j = key($appDataValue); + $appDataValue = is_array($appDataValue[$j]) ? $appDataValue : $appDataValue[$j]; } - } - - // 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_string($dValue)) { + if (is_string($appDataValue)) { foreach ($fieldTypes as $key => $fieldType) { - foreach ($fieldType as $name => $theType) { - if (strtoupper($dKey) == $name) { - $caseData[$dKey] = validateType($dValue, $theType); - unset($name); + foreach ($fieldType as $fieldTypeKey => $fieldTypeValue) { + if (strtoupper($appDataKey) == $fieldTypeKey) { + $appData[$appDataKey] = validateType($appDataValue, $fieldTypeValue); + unset($fieldTypeKey); } } } // normal fields - if (trim($dValue) === '') { - $caseData[$dKey] = null; + if (trim($appDataValue) === '') { + $appData[$appDataKey] = null; } } else { // grids - if (is_array($caseData[$dKey])) { - foreach ($caseData[$dKey] as $dIndex => $dRow) { + if (is_array($appData[$appDataKey])) { + foreach ($appData[$appDataKey] as $dIndex => $dRow) { if (is_array($dRow)) { foreach ($dRow as $k => $v) { if (is_string($v) && trim($v) === '') { - $caseData[$dKey][$dIndex][$k] = null; + $appData[$appDataKey][$dIndex][$k] = null; } } } @@ -794,33 +826,48 @@ class AdditionalTables extends BaseAdditionalTables } } + //populate data + $className = $this->className; if ($type === 'GRID') { list($gridName, $gridUid) = explode('-', $gridKey); - $gridData = isset($caseData[$gridName]) ? $caseData[$gridName] : array(); - + $gridData = isset($appData[$gridName]) ? $appData[$gridName] : []; foreach ($gridData as $i => $gridRow) { - eval('$obj = new ' . $this->className . '();'); - $obj->fromArray($caseData, BasePeer::TYPE_FIELDNAME); + try { + $obj = new $className(); + $obj->fromArray($appData, BasePeer::TYPE_FIELDNAME); + $obj->setAppUid($row['APP_UID']); + $obj->setAppNumber($row['APP_NUMBER']); + if (method_exists($obj, 'setAppStatus')) { + $obj->setAppStatus($row['APP_STATUS']); + } + $obj->fromArray(array_change_key_case($gridRow, CASE_UPPER), BasePeer::TYPE_FIELDNAME); + $obj->setRow($i); + $obj->save(); + } catch (Exception $e) { + $context["message"] = $e->getMessage(); + $context["tableName"] = $tableName; + $context["appUid"] = $row['APP_UID']; + Bootstrap::registerMonolog("sqlExecution", 500, "Sql Execution", $context, $context["workspace"], "processmaker.log"); + } + unset($obj); + } + } else { + try { + $obj = new $className(); + $obj->fromArray(array_change_key_case($appData, CASE_UPPER), BasePeer::TYPE_FIELDNAME); $obj->setAppUid($row['APP_UID']); $obj->setAppNumber($row['APP_NUMBER']); if (method_exists($obj, 'setAppStatus')) { $obj->setAppStatus($row['APP_STATUS']); } - $obj->fromArray(array_change_key_case($gridRow, CASE_UPPER), BasePeer::TYPE_FIELDNAME); - $obj->setRow($i); $obj->save(); - eval('$obj = new ' . $this->className . '();'); + } catch (Exception $e) { + $context["message"] = $e->getMessage(); + $context["tableName"] = $tableName; + $context["appUid"] = $row['APP_UID']; + Bootstrap::registerMonolog("sqlExecution", 500, "Sql Execution", $context, $context["workspace"], "processmaker.log"); } - } else { - eval('$obj = new ' . $this->className . '();'); - $obj->fromArray(array_change_key_case($caseData, CASE_UPPER), BasePeer::TYPE_FIELDNAME); - $obj->setAppUid($row['APP_UID']); - $obj->setAppNumber($row['APP_NUMBER']); - if (method_exists($obj, 'setAppStatus')) { - $obj->setAppStatus($row['APP_STATUS']); - } - $obj->save(); - $obj = null; + unset($obj); } } } @@ -1022,94 +1069,181 @@ class AdditionalTables extends BaseAdditionalTables return $reportTables; } + /** + * Get all data of AdditionalTables. + * + * @param int $start + * @param int $limit + * @param string $filter + * @param array $process + * @return array + */ public function getAll($start = 0, $limit = 20, $filter = '', $process = null) { - $oCriteria = new Criteria('workflow'); - $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_UID); - $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_NAME); - $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_DESCRIPTION); - $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TYPE); - $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TAG); - $oCriteria->addSelectColumn(AdditionalTablesPeer::PRO_UID); - $oCriteria->addSelectColumn(AdditionalTablesPeer::DBS_UID); + $criteria = new Criteria('workflow'); + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_UID); + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_NAME); + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_DESCRIPTION); + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TYPE); + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TAG); + $criteria->addSelectColumn(AdditionalTablesPeer::PRO_UID); + $criteria->addSelectColumn(AdditionalTablesPeer::DBS_UID); if (isset($process)) { foreach ($process as $key => $pro_uid) { if ($key == 'equal') { - $oCriteria->add(AdditionalTablesPeer::PRO_UID, $pro_uid, Criteria::EQUAL); + $criteria->add(AdditionalTablesPeer::PRO_UID, $pro_uid, Criteria::EQUAL); } else { - $oCriteria->add(AdditionalTablesPeer::PRO_UID, $pro_uid, Criteria::NOT_EQUAL); + $criteria->add(AdditionalTablesPeer::PRO_UID, $pro_uid, Criteria::NOT_EQUAL); } } } if ($filter != '' && is_string($filter)) { - $oCriteria->add( - $oCriteria->getNewCriterion(AdditionalTablesPeer::ADD_TAB_NAME, '%' . $filter . '%', Criteria::LIKE)->addOr( - $oCriteria->getNewCriterion(AdditionalTablesPeer::ADD_TAB_DESCRIPTION, '%' . $filter . '%', Criteria::LIKE) - ) - ); + $subCriteria2 = $criteria->getNewCriterion(AdditionalTablesPeer::ADD_TAB_DESCRIPTION, '%' + . $filter + . '%', Criteria::LIKE); + $subCriteria1 = $criteria->getNewCriterion(AdditionalTablesPeer::ADD_TAB_NAME, '%' + . $filter + . '%', Criteria::LIKE) + ->addOr($subCriteria2); + $criteria->add($subCriteria1); } - if (isset($_POST['sort'])) { - if ($_POST['dir'] == 'ASC') { - eval('$oCriteria->addAscendingOrderByColumn(AdditionalTablesPeer::' . $_POST['sort'] . ');'); - } else { - eval('$oCriteria->addDescendingOrderByColumn(AdditionalTablesPeer::' . $_POST['sort'] . ');'); + $criteria->addAsColumn("PRO_TITLE", ProcessPeer::PRO_TITLE); + $criteria->addAsColumn("PRO_DESCRIPTION", ProcessPeer::PRO_DESCRIPTION); + $criteria->addJoin(AdditionalTablesPeer::PRO_UID, ProcessPeer::PRO_UID, Criteria::LEFT_JOIN); + + $stringBuild = ''; + $stringSql = "ADDITIONAL_TABLES.ADD_TAB_NAME IN (" + . "SELECT TABLE_NAME " + . "FROM information_schema.tables " + . "WHERE table_schema = DATABASE()" + . ")"; + $buildNumberRows = clone $criteria; + $buildNumberRows->clear(); + $buildNumberRows->addSelectColumn(AdditionalTablesPeer::ADD_TAB_NAME); + $buildNumberRows->addAsColumn("EXISTS_TABLE", $stringSql); + $dataset1 = AdditionalTablesPeer::doSelectRS($buildNumberRows); + $dataset1->setFetchmode(ResultSet::FETCHMODE_ASSOC); + while ($dataset1->next()) { + $row = $dataset1->getRow(); + $stringCount = "'" . G::LoadTranslation('ID_TABLE_NOT_FOUND') . "'"; + if ($row["EXISTS_TABLE"] === "1") { + $stringCount = "(SELECT COUNT(*) FROM " . $row["ADD_TAB_NAME"] . ")"; } + $stringBuild = $stringBuild + . "WHEN '" . $row["ADD_TAB_NAME"] + . "' THEN " . $stringCount + . " \n"; + } + $clauseRows = empty($stringBuild) ? "''" : "(CASE " + . AdditionalTablesPeer::ADD_TAB_NAME + . " " + . $stringBuild + . " END)"; + $criteria->addAsColumn("NUM_ROWS", $clauseRows); + + if (empty($_POST['sort'])) { + $criteria->addAscendingOrderByColumn(AdditionalTablesPeer::ADD_TAB_NAME); } else { - $oCriteria->addAscendingOrderByColumn(AdditionalTablesPeer::ADD_TAB_NAME); + $column = $_POST["sort"]; + if (defined('AdditionalTablesPeer::' . $column)) { + $column = constant('AdditionalTablesPeer::' . $column); + } + if ($column === "NUM_ROWS") { + $column = "IF(" . $column . "='" . G::LoadTranslation('ID_TABLE_NOT_FOUND') . "',-1," . $column . ")"; + } + if ($_POST['dir'] == 'ASC') { + $criteria->addAscendingOrderByColumn($column); + } else { + $criteria->addDescendingOrderByColumn($column); + } } - $criteriaCount = clone $oCriteria; + $criteriaCount = clone $criteria; $count = AdditionalTablesPeer::doCount($criteriaCount); - $oCriteria->setLimit($limit); - $oCriteria->setOffset($start); + $criteria->setLimit($limit); + $criteria->setOffset($start); - $oDataset = AdditionalTablesPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $dataset = AdditionalTablesPeer::doSelectRS($criteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $addTables = array(); - $proUids = array(); - - while ($oDataset->next()) { - $row = $oDataset->getRow(); - $row['PRO_TITLE'] = $row['PRO_DESCRIPTION'] = ''; + $addTables = []; + while ($dataset->next()) { + $row = $dataset->getRow(); $addTables[] = $row; - if ($row['PRO_UID'] != '') { - $proUids[] = $row['PRO_UID']; - } } - //process details will have the info about the processes - $procDetails = array(); + return [ + 'rows' => $addTables, + 'count' => $count + ]; + } - if (count($proUids) > 0) { - //now get the labels for all process, using an array of Uids, - $c = new Criteria('workflow'); - $c->add(ProcessPeer::PRO_UID, $proUids, Criteria::IN); - $dt = ProcessPeer::doSelectRS($c); - $dt->setFetchmode(ResultSet::FETCHMODE_ASSOC); + /** + * Get the table properties + * + * @param string $tabUid + * @param array $tabData + * @param boolean $isReportTable + * + * @return array + * @throws Exception + */ + public static function getTableProperties($tabUid, $tabData = [], $isReportTable = false) + { + $criteria = new Criteria('workflow'); + $criteria->add(AdditionalTablesPeer::ADD_TAB_UID, $tabUid, Criteria::EQUAL); + $dataset = AdditionalTablesPeer::doSelectOne($criteria); - while ($dt->next()) { - $row = $dt->getRow(); - $procDetails[$row['PRO_UID']]['PRO_TITLE'] = $row['PRO_TITLE']; - $procDetails[$row['PRO_UID']]['PRO_DESCRIPTION'] = $row['PRO_DESCRIPTION']; + $dataValidate = []; + if (!is_null($dataset)) { + $dataValidate['rep_tab_uid'] = $tabUid; + + $tableName = $dataset->getAddTabName(); + if (substr($tableName, 0, 4) === 'PMT_') { + $tableNameWithoutPrefixPmt = substr($tableName, 4); + } else { + $tableNameWithoutPrefixPmt = $tableName; } - foreach ($addTables as $i => $addTable) { - if (isset($procDetails[$addTable['PRO_UID']]['PRO_TITLE'])) { - $addTables[$i]['PRO_TITLE'] = $procDetails[$addTable['PRO_UID']]['PRO_TITLE']; - } + $dataValidate['rep_tab_name'] = $tableNameWithoutPrefixPmt; + $dataValidate['rep_tab_name_old_name'] = $tableName; + $dataValidate['pro_uid'] = $dataset->getProUid(); + $dataValidate['rep_tab_dsc'] = $dataset->getAddTabDescription(); + $dataValidate['rep_tab_connection'] = $dataset->getDbsUid(); + $dataValidate['rep_tab_type'] = $dataset->getAddTabType(); + $dataValidate['rep_tab_grid'] = ''; - if (isset($procDetails[$addTable['PRO_UID']]['PRO_DESCRIPTION'])) { - $addTables[$i]['PRO_DESCRIPTION'] = $procDetails[$addTable['PRO_UID']]['PRO_DESCRIPTION']; + if ($isReportTable) { + if (!empty($tabData['pro_uid']) && $dataValidate['pro_uid'] !== $tabData['pro_uid']) { + throw (new Exception("The property pro_uid: '". $tabData['pro_uid'] . "' is incorrect.")); + } + if (!empty($tabData['rep_tab_name']) && $tableName !== $tabData['rep_tab_name']) { + throw (new Exception("The property rep_tab_name: '". $tabData['rep_tab_name'] . "' is incorrect.")); + } + if (!empty($dataValidate['rep_tab_dsc'])) { + $dataValidate['rep_tab_dsc'] = $tabData['rep_tab_dsc']; + } + $tabGrid = $dataset->getAddTabGrid(); + if (strpos($tabGrid, '-')) { + list($gridName, $gridId) = explode('-', $tabGrid); + $dataValidate['rep_tab_grid'] = $gridId; + } + } else { + if (!empty($tabData['rep_tab_name']) && $tableName !== $tabData['pmt_tab_name']) { + throw (new Exception("The property pmt_tab_name: '". $tabData['pmt_tab_name'] . "' is incorrect.")); + } + if (!empty($dataValidate['pmt_tab_dsc'])) { + $dataValidate['rep_tab_dsc'] = $tabData['pmt_tab_dsc']; } } + $dataValidate['fields'] = $tabData['fields']; } - return array('rows' => $addTables, 'count' => $count); + return $dataValidate; } /** diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index 8c58d0a38..52ff365a7 100644 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -8975,6 +8975,12 @@ msgstr "No skins to display" msgid "No users to display" msgstr "No users to display" +# TRANSLATION +# LABEL/ID_GRID_VARIABLE_NAME_ERROR +#: LABEL/ID_GRID_VARIABLE_NAME_ERROR +msgid "A valid variable starts with a letter or underscore, followed by any number of letters, numbers, or underscores. Variables with wrong names: {0}" +msgstr "A valid variable starts with a letter or underscore, followed by any number of letters, numbers, or underscores. Variables with wrong names: {0}" + # TRANSLATION # LABEL/ID_GRID_WIZARD #: LABEL/ID_GRID_WIZARD @@ -17981,6 +17987,24 @@ msgstr "The mafe translation file is not writable.
Please give write permis msgid "Your message has been sent successfully" msgstr "Your message has been sent successfully" +# TRANSLATION +# LABEL/ID_MAIL_STATUS_ERROR +#: LABEL/ID_MAIL_STATUS_ERROR +msgid "Error" +msgstr "Error" + +# TRANSLATION +# LABEL/ID_MAIL_STATUS_PENDING +#: LABEL/ID_MAIL_STATUS_PENDING +msgid "Pending" +msgstr "Pending" + +# TRANSLATION +# LABEL/ID_MAIL_STATUS_SENT +#: LABEL/ID_MAIL_STATUS_SENT +msgid "Sent" +msgstr "Sent" + # TRANSLATION # LABEL/ID_MAIL_TEST_SUCCESS #: LABEL/ID_MAIL_TEST_SUCCESS @@ -20705,6 +20729,12 @@ msgstr "File \"{0}\" imported but with errors:" msgid "The following fields cannot be created because they contain the reserved words \"{0}\"" msgstr "The following fields cannot be created because they contain the reserved words \"{0}\"" +# TRANSLATION +# LABEL/ID_PMTABLE_INVALID_FIELD_NAME_VARIABLE +#: LABEL/ID_PMTABLE_INVALID_FIELD_NAME_VARIABLE +msgid "There is a conflict with some field names: \"{0}\", please rename them avoiding the use of numbers and considering that underscores are ignored when validating unique field names." +msgstr "There is a conflict with some field names: \"{0}\", please rename them avoiding the use of numbers and considering that underscores are ignored when validating unique field names." + # TRANSLATION # LABEL/ID_PMTABLE_INVALID_FILE #: LABEL/ID_PMTABLE_INVALID_FILE diff --git a/workflow/engine/controllers/pmTablesProxy.php b/workflow/engine/controllers/pmTablesProxy.php index 0c45b18dd..ed62a64a1 100644 --- a/workflow/engine/controllers/pmTablesProxy.php +++ b/workflow/engine/controllers/pmTablesProxy.php @@ -26,68 +26,70 @@ class pmTablesProxy extends HttpProxyController * @param string $httpData->limit * @param string $httpData->textFilter */ - public function getList ($httpData) + public function getList($httpData) { $configurations = new Configurations(); $processMap = new ProcessMap(); // setting parameters - $config = $configurations->getConfiguration( 'additionalTablesList', 'pageSize', '', $_SESSION['USER_LOGGED'] ); - $env = $configurations->getConfiguration( 'ENVIRONMENT_SETTINGS', '' ); - $limit_size = isset( $config->pageSize ) ? $config['pageSize'] : 20; - $start = isset( $httpData->start ) ? $httpData->start : 0; - $limit = isset( $httpData->limit ) ? $httpData->limit : $limit_size; - $filter = isset( $httpData->textFilter ) ? $httpData->textFilter : ''; - $pro_uid = isset( $httpData->pro_uid ) ? $httpData->pro_uid : null; + $config = $configurations->getConfiguration('additionalTablesList', 'pageSize', '', $_SESSION['USER_LOGGED']); + $env = $configurations->getConfiguration('ENVIRONMENT_SETTINGS', ''); + $limit_size = isset($config->pageSize) ? $config['pageSize'] : 20; + $start = isset($httpData->start) ? $httpData->start : 0; + $limit = isset($httpData->limit) ? $httpData->limit : $limit_size; + $filter = isset($httpData->textFilter) ? $httpData->textFilter : ''; + $pro_uid = isset($httpData->pro_uid) ? $httpData->pro_uid : null; if ($pro_uid !== null) { - $process = $pro_uid == '' ? array ('not_equal' => $pro_uid - ) : array ('equal' => $pro_uid); - $addTables = AdditionalTables::getAll( false, false, $filter, $process ); + $process = $pro_uid == '' ? ['not_equal' => $pro_uid] : ['equal' => $pro_uid]; + $addTables = AdditionalTables::getAll(false, false, $filter, $process); - $c = $processMap->getReportTablesCriteria( $pro_uid ); - $oDataset = RoutePeer::doSelectRS( $c ); - $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); - $reportTablesOldList = array (); + $c = $processMap->getReportTablesCriteria($pro_uid); + $oDataset = RoutePeer::doSelectRS($c); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $reportTablesOldList = array(); while ($oDataset->next()) { $reportTablesOldList[] = $oDataset->getRow(); } foreach ($reportTablesOldList as $i => $oldRepTab) { - if($filter != ''){ - if((stripos($oldRepTab['REP_TAB_NAME'], $filter) !== false) || (stripos($oldRepTab['REP_TAB_TITLE'], $filter) !== false)){ - $addTables['rows'][] = array ('ADD_TAB_UID' => $oldRepTab['REP_TAB_UID'],'PRO_UID' => $oldRepTab['PRO_UID'],'DBS_UID' => ($oldRepTab['REP_TAB_CONNECTION'] == 'wf' ? 'workflow' : 'rp'),'ADD_TAB_DESCRIPTION' => $oldRepTab['REP_TAB_TITLE'],'ADD_TAB_NAME' => $oldRepTab['REP_TAB_NAME'],'ADD_TAB_TYPE' => $oldRepTab['REP_TAB_TYPE'],'TYPE' => 'CLASSIC' ); - } - } else { - $addTables['rows'][] = array ('ADD_TAB_UID' => $oldRepTab['REP_TAB_UID'],'PRO_UID' => $oldRepTab['PRO_UID'],'DBS_UID' => ($oldRepTab['REP_TAB_CONNECTION'] == 'wf' ? 'workflow' : 'rp'),'ADD_TAB_DESCRIPTION' => $oldRepTab['REP_TAB_TITLE'],'ADD_TAB_NAME' => $oldRepTab['REP_TAB_NAME'],'ADD_TAB_TYPE' => $oldRepTab['REP_TAB_TYPE'],'TYPE' => 'CLASSIC' ); - } + if ($filter != '') { + if ((stripos($oldRepTab['REP_TAB_NAME'], $filter) !== false) || + (stripos($oldRepTab['REP_TAB_TITLE'], $filter) !== false)) { + $addTables['rows'][] = [ + 'ADD_TAB_UID' => $oldRepTab['REP_TAB_UID'], + 'PRO_UID' => $oldRepTab['PRO_UID'], + 'DBS_UID' => ($oldRepTab['REP_TAB_CONNECTION'] == 'wf' ? 'workflow' : 'rp'), + 'ADD_TAB_DESCRIPTION' => $oldRepTab['REP_TAB_TITLE'], + 'ADD_TAB_NAME' => $oldRepTab['REP_TAB_NAME'], + 'ADD_TAB_TYPE' => $oldRepTab['REP_TAB_TYPE'], + 'TYPE' => 'CLASSIC' + ]; + } + } else { + $addTables['rows'][] = [ + 'ADD_TAB_UID' => $oldRepTab['REP_TAB_UID'], + 'PRO_UID' => $oldRepTab['PRO_UID'], + 'DBS_UID' => ($oldRepTab['REP_TAB_CONNECTION'] == 'wf' ? 'workflow' : 'rp'), + 'ADD_TAB_DESCRIPTION' => $oldRepTab['REP_TAB_TITLE'], + 'ADD_TAB_NAME' => $oldRepTab['REP_TAB_NAME'], + 'ADD_TAB_TYPE' => $oldRepTab['REP_TAB_TYPE'], + 'TYPE' => 'CLASSIC' + ]; + } } $addTables['count'] = count($addTables['rows']); - if($start != 0){ - $addTables['rows'] = array_splice($addTables['rows'], $start); + if ($start != 0) { + $addTables['rows'] = array_splice($addTables['rows'], $start); } $addTables['rows'] = array_splice($addTables['rows'], 0, $limit); } else { - $addTables = AdditionalTables::getAll( $start, $limit, $filter ); + $addTables = AdditionalTables::getAll($start, $limit, $filter); } foreach ($addTables['rows'] as $i => $table) { - try { - $con = Propel::getConnection( PmTable::resolveDbSource( $table['DBS_UID'] ) ); - $stmt = $con->createStatement(); - $rs = $stmt->executeQuery( 'SELECT COUNT(*) AS NUM_ROWS from ' . $table['ADD_TAB_NAME'] ); - if ($rs->next()) { - $r = $rs->getRow(); - $addTables['rows'][$i]['NUM_ROWS'] = $r['NUM_ROWS']; - } else { - $addTables['rows'][$i]['NUM_ROWS'] = 0; - } - - //removing the prefix "PMT" to allow alphabetical order (just in view) - if (substr( $addTables['rows'][$i]['ADD_TAB_NAME'], 0, 4 ) == 'PMT_') { - $addTables['rows'][$i]['ADD_TAB_NAME'] = substr( $addTables['rows'][$i]['ADD_TAB_NAME'], 4 ); - } - } catch (Exception $e) { - $addTables['rows'][$i]['NUM_ROWS'] = G::LoadTranslation( 'ID_TABLE_NOT_FOUND' ); + //removing the prefix "PMT" to allow alphabetical order (just in view) + if (substr($addTables['rows'][$i]['ADD_TAB_NAME'], 0, 4) == 'PMT_') { + $addTables['rows'][$i]['ADD_TAB_NAME'] = substr($addTables['rows'][$i]['ADD_TAB_NAME'], 4); } } @@ -1152,7 +1154,13 @@ class pmTablesProxy extends HttpProxyController } } - public function genDataReport ($httpData) + /** + * It eliminates and generates the data report from the cases of a process. + * + * @param object $httpData + * @return object + */ + public function genDataReport($httpData) { $result = new stdClass(); @@ -1160,12 +1168,26 @@ class pmTablesProxy extends HttpProxyController $result->success = true; $additionalTables = new AdditionalTables(); - $table = $additionalTables->load( $httpData->id ); - if ($table['PRO_UID'] != '') { - $additionalTables->populateReportTable( $table['ADD_TAB_NAME'], PmTable::resolveDbSource( $table['DBS_UID'] ), $table['ADD_TAB_TYPE'], $table['PRO_UID'], $table['ADD_TAB_GRID'], $table['ADD_TAB_UID'] ); - $result->message = 'generated for table ' . $table['ADD_TAB_NAME']; - } + $table = $additionalTables->load($httpData->id); + if (!empty($table) && $table['PRO_UID'] != '') { + try { + $additionalTables->populateReportTable($table['ADD_TAB_NAME'], PmTable::resolveDbSource($table['DBS_UID']), $table['ADD_TAB_TYPE'], $table['PRO_UID'], $table['ADD_TAB_GRID'], $table['ADD_TAB_UID']); + $result->message = 'Generated for table ' . $table['ADD_TAB_NAME']; + } catch (Exception $e) { + $context = Bootstrap::getDefaultContextLog(); + $context['proUid'] = $table['PRO_UID']; + $context['tableName'] = $table['ADD_TAB_NAME']; + $context['message'] = $e->getMessage(); + Bootstrap::registerMonolog('dataReport', 500, 'Generation of data report could not be completed', $context, $context['workspace'], 'processmaker.log'); + + $result->message = 'Generation of data report could not be completed. Please check the processmaker.log for more details.'; + $result->success = false; + } + } else { + $result->message = 'Unable to retrieve the table for this id: ' . $httpData->id . '.'; + $result->success = false; + } return $result; } diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index bab798762..202b8e595 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -58323,6 +58323,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_GRID_PAGE_NO_ROWS_MESSAGE','en','No rows to display','2014-01-15') , ( 'LABEL','ID_GRID_PAGE_NO_SKIN_MESSAGE','en','No skins to display','2014-01-15') , ( 'LABEL','ID_GRID_PAGE_NO_USERS_MESSAGE','en','No users to display','2014-01-15') , +( 'LABEL','ID_GRID_VARIABLE_NAME_ERROR','en','A valid variable starts with a letter or underscore, followed by any number of letters, numbers, or underscores. Variables with wrong names: {0}','2017-11-16') , ( 'LABEL','ID_GRID_WIZARD','en','ProcessMaker Grid Wizard','2014-01-15') , ( 'LABEL','ID_GROUP','en','Group','2014-01-15') , ( 'LABEL','ID_GROUPS','en','Groups','2014-01-15') , @@ -59834,6 +59835,9 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_MAFE_TRANSLATION_DIRECTORY','en','Mafe Translation Directory','2018-07-09') , ( 'LABEL','ID_MAFE_TRANSLATION_NOT_WRITEABLE','en','The mafe translation file is not writable.
Please give write permission to file:','2018-07-09') , ( 'LABEL','ID_MAIL_SENT_SUCCESSFULLY','en','Your message has been sent successfully','2014-01-15') , +( 'LABEL','ID_MAIL_STATUS_ERROR','en','Error','2018-10-02') , +( 'LABEL','ID_MAIL_STATUS_PENDING','en','Pending','2018-10-02') , +( 'LABEL','ID_MAIL_STATUS_SENT','en','Sent','2018-10-02') , ( 'LABEL','ID_MAIL_TEST_SUCCESS','en','Test message sent successfully','2014-01-15') , ( 'LABEL','ID_MAIL_TO_NOT_VALID_ADDRESS','en','"Mail to" does not contain a valid email address format','2014-01-15') , ( 'LABEL','ID_MAINTENANCE','en','Maintenance','2014-01-15') ; @@ -60300,6 +60304,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_PMTABLE_IMPORT_SUCCESS','en','File "{0}" imported successfully.','2014-01-15') , ( 'LABEL','ID_PMTABLE_IMPORT_WITH_ERRORS','en','File "{0}" imported but with errors:','2016-02-18') , ( 'LABEL','ID_PMTABLE_INVALID_FIELD_NAME','en','The following fields cannot be created because they contain the reserved words "{0}"','2014-10-21') , +( 'LABEL','ID_PMTABLE_INVALID_FIELD_NAME_VARIABLE','en','There is a conflict with some field names: "{0}", please rename them avoiding the use of numbers and considering that underscores are ignored when validating unique field names.','2018-04-03') , ( 'LABEL','ID_PMTABLE_INVALID_FILE','en','Invalid PM table(s) file, import aborted!','2014-01-15') , ( 'LABEL','ID_PMTABLE_INVALID_NAME','en','Could not create the table with the name "{0}" because it is a reserved word.','2014-01-15') , ( 'LABEL','ID_PMTABLE_NOT_FOUND','en','The PM Table associated with this DynaForm could not be found.','2014-11-12') , diff --git a/workflow/engine/methods/setup/cronAjax.php b/workflow/engine/methods/setup/cronAjax.php index a0dcc40a1..7bf5e46a3 100644 --- a/workflow/engine/methods/setup/cronAjax.php +++ b/workflow/engine/methods/setup/cronAjax.php @@ -1,117 +1,10 @@ 1) { - $date = (isset( $arrayAux[0] )) ? trim( $arrayAux[0] ) : ""; - $workspace = (isset( $arrayAux[1] )) ? trim( $arrayAux[1] ) : ""; - $action = (isset( $arrayAux[2] )) ? trim( $arrayAux[2] ) : ""; - $status = (isset( $arrayAux[3] )) ? trim( $arrayAux[3] ) : ""; - $description = (isset( $arrayAux[4] )) ? trim( $arrayAux[4] ) : ""; - } - - $mktDate = (! empty( $date )) ? mktimeDate( $date ) : 0; - - //Filter - $sw = 1; - - if ($filter["workspace"] != "ALL" && $workspace != $filter["workspace"]) { - $sw = 0; - } - - if ($filter["status"] != "ALL") { - switch ($filter["status"]) { - case "COMPLETED": - if ($status != "action") { - $sw = 0; - } - break; - case "FAILED": - if ($status == "action") { - $sw = 0; - } - break; - } - } - - if (! empty( $filter["dateFrom"] ) && $mktDate > 0) { - if (! (mktimeDate( $filter["dateFrom"] ) <= $mktDate)) { - $sw = 0; - } - } - - if (! empty( $filter["dateTo"] ) && $mktDate > 0) { - if (! ($mktDate <= mktimeDate( $filter["dateTo"] . " 23:59:59" ))) { - $sw = 0; - } - } - - $arrayData = array (); - - if ($sw == 1) { - $arrayData = array ("DATE" => $date, "ACTION" => $action, "STATUS" => $status, "DESCRIPTION" => $description - ); - } - - return $arrayData; -} - -function cronDataGet ($filter, $r, $i) -{ - $i = $i + 1; - - $arrayData = array (); - $strAux = null; - $numRec = 0; - $cont = 0; - - $file = PATH_DATA . "log" . PATH_SEP . "cron.log"; - - if (file_exists($file)) { - $arrayFileData = file($file); - - for ($k = 0; $k <= count($arrayFileData) - 1; $k++) { - $strAux = $arrayFileData[$k]; - - if (!empty($strAux)) { - $arrayAux = cronArraySet($strAux, $filter); - - if (count($arrayAux) > 0) { - $cont = $cont + 1; - - if ($cont >= $i && count($arrayData) + 1 <= $r) { - $arrayData[] = $arrayAux; - } - } - } - } - } - - $numRec = $cont; - - return array($numRec, $arrayData); -} - -$option = (isset( $_REQUEST["option"] )) ? $_REQUEST["option"] : null; - -$response = array (); +$response = []; switch ($option) { case "LST": @@ -121,40 +14,42 @@ switch ($option) { $dateFrom = $_REQUEST["dateFrom"]; $dateTo = $_REQUEST["dateTo"]; - $arrayFilter = array ("workspace" => $workspace,"status" => $status,"dateFrom" => str_replace( "T00:00:00", null, $dateFrom ),"dateTo" => str_replace( "T00:00:00", null, $dateTo ) - ); + $filter = [ + "workspace" => $workspace, + "status" => $status, + "dateFrom" => str_replace("T00:00:00", null, $dateFrom), + "dateTo" => str_replace("T00:00:00", null, $dateTo) + ]; - $limit = isset( $_REQUEST["limit"] ) ? $_REQUEST["limit"] : $pageSize; - $start = isset( $_REQUEST["start"] ) ? $_REQUEST["start"] : 0; + $start = (int) isset($_REQUEST["start"]) ? $_REQUEST["start"] : 0; + $limit = (int) isset($_REQUEST["limit"]) ? $_REQUEST["limit"] : $pageSize; - list ($numRec, $data) = cronDataGet( $arrayFilter, $limit, $start ); + $cron = new Cron(); + list ($count, $data) = $cron->getData($filter, $start, $limit); - $response = array ("success" => true,"resultTotal" => $numRec,"resultRoot" => $data - ); + $response = [ + "success" => true, + "resultTotal" => $count, + "resultRoot" => $data + ]; break; case "EMPTY": $status = 1; - try { $file = PATH_DATA . "log" . PATH_SEP . "cron.log"; - - if (file_exists( $file )) { - //file_put_contents($file, null); - unlink( $file ); + if (file_exists($file)) { + unlink($file); } - $response["status"] = "OK"; G::auditLog("ClearCron"); } catch (Exception $e) { $response["message"] = $e->getMessage(); $status = 0; } - if ($status == 0) { $response["status"] = "ERROR"; } break; } -echo G::json_encode( $response ); - +echo G::json_encode($response); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php b/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php index 37de0394e..968335963 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php @@ -9,6 +9,7 @@ use AbeRequests; use AbeRequestsPeer; use AbeResponsesPeer; use ApplicationPeer; +use AppDelegation; use AppDelegationPeer; use Criteria; use EmailServerPeer; @@ -23,6 +24,7 @@ use PMLicensedFeatures; use ProcessPeer; use ResultSet; use SpoolRun; +use Users as ClassUsers; use stdClass; use UsersPeer; use TaskPeer; @@ -266,11 +268,18 @@ class ActionsByEmail return $response; } + /** + * Get the information for the log + * + * @param array $arrayData + * + * @return array + */ public function loadActionByEmail(array $arrayData) { + //Get the total $criteria = new Criteria(); $criteria->addSelectColumn('COUNT(*)'); - $criteria->addJoin(AbeConfigurationPeer::ABE_UID, AbeRequestsPeer::ABE_UID); $criteria->addJoin(AppDelegationPeer::APP_UID, AbeRequestsPeer::APP_UID); $criteria->addJoin(AppDelegationPeer::DEL_INDEX, AbeRequestsPeer::DEL_INDEX); @@ -288,7 +297,6 @@ class ActionsByEmail $criteria->addSelectColumn(AbeConfigurationPeer::ABE_TEMPLATE); $criteria->addSelectColumn(AbeConfigurationPeer::ABE_ACTION_FIELD); $criteria->addSelectColumn(AbeConfigurationPeer::DYN_UID); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_UID); $criteria->addSelectColumn(AbeRequestsPeer::APP_UID); $criteria->addSelectColumn(AbeRequestsPeer::DEL_INDEX); @@ -298,14 +306,10 @@ class ActionsByEmail $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_ANSWERED); $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_BODY); $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_DATE); - - $criteria->addSelectColumn(ApplicationPeer::APP_NUMBER); - + $criteria->addSelectColumn(AppDelegationPeer::APP_NUMBER); $criteria->addSelectColumn(AppDelegationPeer::DEL_PREVIOUS); - + $criteria->addSelectColumn(AppDelegationPeer::USR_UID); $criteria->addJoin(AbeConfigurationPeer::ABE_UID, AbeRequestsPeer::ABE_UID); - $criteria->addJoin(ApplicationPeer::APP_UID, AbeRequestsPeer::APP_UID); - $criteria->addJoin(AppDelegationPeer::APP_UID, AbeRequestsPeer::APP_UID); $criteria->addJoin(AppDelegationPeer::DEL_INDEX, AbeRequestsPeer::DEL_INDEX); $criteria->addDescendingOrderByColumn(AbeRequestsPeer::ABE_REQ_DATE); @@ -313,66 +317,37 @@ class ActionsByEmail $criteria->setOffset($arrayData['start']); $result = AbeConfigurationPeer::doSelectRS($criteria); $result->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $data = Array(); - $arrayPro = Array(); - $arrayTAS = Array(); + $data = []; $index = 0; - while ($result->next()) { - $data[] = $result->getRow(); - $criteriaRes = new Criteria(); + $row = $result->getRow(); + $row['ABE_REQ_STATUS'] = G::LoadTranslation('ID_MAIL_STATUS_' . $row['ABE_REQ_STATUS']); + $data[] = $row; + //Get the response + $abe = new AbeRequests(); + $dataRes = $abe->load($data[$index]['ABE_REQ_UID']); + $data[$index]['ABE_RES_UID'] = !empty($dataRes['ABE_RES_UID']) ? $dataRes['ABE_RES_UID'] : ''; + $data[$index]['ABE_RES_CLIENT_IP'] = !empty($dataRes['ABE_RES_CLIENT_IP']) ? $dataRes['ABE_RES_CLIENT_IP'] : ''; + $data[$index]['ABE_RES_DATA'] = !empty($dataRes['ABE_RES_DATA']) ? $dataRes['ABE_RES_DATA'] : ''; + $data[$index]['ABE_RES_STATUS'] = !empty($dataRes['ABE_RES_STATUS']) ? $dataRes['ABE_RES_STATUS'] : ''; + $data[$index]['ABE_RES_MESSAGE'] = !empty($dataRes['ABE_RES_UID']) ? $dataRes['ABE_RES_MESSAGE'] : ''; - $criteriaRes->addSelectColumn(AbeResponsesPeer::ABE_RES_UID); - $criteriaRes->addSelectColumn(AbeResponsesPeer::ABE_RES_CLIENT_IP); - $criteriaRes->addSelectColumn(AbeResponsesPeer::ABE_RES_DATA); - $criteriaRes->addSelectColumn(AbeResponsesPeer::ABE_RES_STATUS); - $criteriaRes->addSelectColumn(AbeResponsesPeer::ABE_RES_MESSAGE); - - $criteriaRes->add(AbeResponsesPeer::ABE_REQ_UID, $data[$index]['ABE_REQ_UID']); - - $resultRes = AbeResponsesPeer::doSelectRS($criteriaRes); - $resultRes->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $resultRes->next(); - $dataRes = Array(); - - if ($dataRes = $resultRes->getRow()) { - $data[$index]['ABE_RES_UID'] = $dataRes['ABE_RES_UID']; - $data[$index]['ABE_RES_CLIENT_IP'] = $dataRes['ABE_RES_CLIENT_IP']; - $data[$index]['ABE_RES_DATA'] = $dataRes['ABE_RES_DATA']; - $data[$index]['ABE_RES_STATUS'] = $dataRes['ABE_RES_STATUS']; - $data[$index]['ABE_RES_MESSAGE'] = $dataRes['ABE_RES_MESSAGE']; - } else { - $data[$index]['ABE_RES_UID'] = ''; - $data[$index]['ABE_RES_CLIENT_IP'] = ''; - $data[$index]['ABE_RES_DATA'] = ''; - $data[$index]['ABE_RES_STATUS'] = ''; - $data[$index]['ABE_RES_MESSAGE'] = ''; - } - - $criteriaRes = new Criteria(); - - $criteriaRes->addSelectColumn(AppDelegationPeer::USR_UID); - $criteriaRes->addSelectColumn(UsersPeer::USR_FIRSTNAME); - $criteriaRes->addSelectColumn(UsersPeer::USR_LASTNAME); - - $criteria->addJoin(AppDelegationPeer::APP_UID, $data[$index]['APP_UID']); - $criteria->addJoin(AppDelegationPeer::DEL_INDEX, $data[$index]['DEL_PREVIOUS']); - $criteria->addJoin(AppDelegationPeer::USR_UID, UsersPeer::USR_UID); - $resultRes = AppDelegationPeer::doSelectRS($criteriaRes); - $resultRes->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $resultRes->next(); - - if ($dataRes = $resultRes->getRow()) { + //Get the previous user + $appDelegation = new AppDelegation(); + $usrUid = $appDelegation->getUserAssignedInThread($data[$index]['APP_UID'], $data[$index]['DEL_PREVIOUS']); + $users = new ClassUsers(); + $dataRes = $users->load($usrUid); + if (!empty($dataRes)) { $data[$index]['USER'] = $dataRes['USR_FIRSTNAME'] . ' ' . $dataRes['USR_LASTNAME']; } else { $data[$index]['USER'] = ''; } - $data[$index]['ABE_REQ_ANSWERED'] = ($data[$index]['ABE_REQ_ANSWERED'] == 1) ? 'YES' : 'NO'; + $data[$index]['ABE_REQ_ANSWERED'] = ($data[$index]['ABE_REQ_ANSWERED'] == 1) ? G::LoadTranslation('ID_YES') : G::LoadTranslation('ID_NO'); $index++; } - $response = array(); + $response = []; $response['totalCount'] = $totalCount; $response['data'] = $data; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php index ebc9fc2d9..f8e177c1e 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php @@ -386,11 +386,12 @@ class InputDocument * * @param string $applicationUid * @param string $userUid + * @param array $documentsCanAccess * * @return array Return an array with data of an InputDocument * @throws Exception */ - public function getCasesInputDocuments($applicationUid, $userUid) + public function getCasesInputDocuments($applicationUid, $userUid, $documentsCanAccess = []) { try { //Verify data inbox @@ -415,7 +416,10 @@ class InputDocument $criteria = $this->getAppDocumentCriteriaByData($applicationUid); if (!$flagInbox) { - $criteria->add(AppDocumentPeer::USR_UID, $userUid, Criteria::EQUAL); + $criteria->add( + $criteria->getNewCriterion(AppDocumentPeer::USR_UID, $userUid, Criteria::EQUAL)->addOr( + $criteria->getNewCriterion(AppDocumentPeer::APP_DOC_UID, $documentsCanAccess, Criteria::IN)) + ); } $rsCriteria = AppDocumentPeer::doSelectRS($criteria); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/DynaForm.php b/workflow/engine/src/ProcessMaker/BusinessModel/DynaForm.php index cea3ed5e7..d2c1bb2a9 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/DynaForm.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/DynaForm.php @@ -2,7 +2,11 @@ namespace ProcessMaker\BusinessModel; +use AdditionalTables; use DynaformHandler; +use Exception; +use G; +use PmDynaform; class DynaForm { @@ -407,6 +411,8 @@ class DynaForm $this->throwExceptionIfExistsTitle($processUid, $arrayData["DYN_TITLE"], $this->arrayFieldNameForException["dynaFormTitle"]); + $this->throwExceptionIfTheColumnIdentifierIsNotValid($arrayData); + //Create $dynaForm = new \Dynaform(); @@ -461,6 +467,8 @@ class DynaForm $this->throwExceptionIfExistsTitle($processUid, $arrayData["DYN_TITLE"], $this->arrayFieldNameForException["dynaFormTitle"], $dynaFormUid); } + $this->throwExceptionIfTheColumnIdentifierIsNotValid($arrayData); + //Update $arrayData["DYN_UID"] = $dynaFormUid; @@ -1131,4 +1139,74 @@ class DynaForm throw $e; } } + + /** + * Validates if the grid columns tha will be stored have valid names, otherwise + * it throws an exception. + * + * @param array $arrayData, form data that will be saved + * + * @throws Exception + */ + public function throwExceptionIfTheColumnIdentifierIsNotValid($arrayData) + { + if (isset($arrayData['DYN_CONTENT'])) { + $oldDynaform = $this->getDynaFormRecordByPk($arrayData['DYN_UID'], []); + $oldGrids = PmDynaform::getGridsAndFields($oldDynaform['DYN_CONTENT']); + $oldColumns = $this->getColumnsOfArrayGrids($oldGrids); + + $grids = PmDynaform::getGridsAndFields($arrayData['DYN_CONTENT']); + $columns = $this->getColumnsOfArrayGrids($grids); + + foreach ($oldColumns as $oldField) { + foreach ($columns as $key => $field) { + if ($oldField->id === $field->id) { + unset($columns[$key]); + break; + } + } + } + + $invalids = []; + $identicals = []; + foreach ($columns as $column) { + try { + Validator::isValidVariableName($column->id); + } catch (Exception $e) { + $invalids[] = $column->id; + } + foreach ($oldColumns as $oldColumn) { + if (strtolower(AdditionalTables::getPHPName($column->id)) === strtolower(AdditionalTables::getPHPName($oldColumn->id))) { + $identicals[] = "'" . $column->id . "' - '" . $oldColumn->id . "'"; + } + } + } + + if (count($invalids) > 0) { + throw (new Exception(G::LoadTranslation("ID_GRID_VARIABLE_NAME_ERROR", [implode(', ', $invalids)]))); + } + + if (count($identicals) > 0) { + throw (new Exception(G::LoadTranslation("DYNAFIELD_PHPNAME_ALREADY_EXIST", [implode(', ', $identicals)]))); + } + } + } + + /** + * Gets a list of all columns of the grid array. + * + * @param array $grids + * + * @return array + */ + private function getColumnsOfArrayGrids($grids) + { + $columns = []; + foreach ($grids as $grid) { + if (isset($grid->columns)) { + $columns = array_merge($columns, $grid->columns); + } + } + return $columns; + } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Files/Cron.php b/workflow/engine/src/ProcessMaker/BusinessModel/Files/Cron.php new file mode 100644 index 000000000..35d565485 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Files/Cron.php @@ -0,0 +1,146 @@ +setFilepath(PATH_DATA . 'log' . PATH_SEP . 'cron.log'); + } + + /** + * Set the cron file log path. + * + * @param string $filepath + */ + public function setFilepath($filepath) + { + $this->filepath = $filepath; + } + + /** + * Get data from file. + * + * @param array $filter + * @param int $start + * @param int $limit + * @return array + */ + public function getData($filter, $start = 0, $limit = 20) + { + if (!file_exists($this->filepath)) { + return [0, []]; + } + $result = []; + $count = 0; + $array = file($this->filepath); + foreach ($array as $line) { + if (empty($line)) { + continue; + } + $row = $this->getRow($line, $filter); + if ($row === null) { + continue; + } + $count = $count + 1; + if ($start < $count && count($result) < $limit) { + $row['DATE'] = DateTime::convertUtcToTimeZone($row['DATE']); + $result[] = $row; + } + } + return [$count, $result]; + } + + /** + * Get registry from string line. + * + * @param string $line + * @param array $filter + * @return array + */ + public function getRow($line, $filter) + { + $row = explode('|', $line); + $date = ''; + $workspace = ''; + $action = ''; + $status = ''; + $description = trim($row[0]); + + if (!empty($row)) { + $date = isset($row[0]) ? trim($row[0]) : ''; + $workspace = isset($row[1]) ? trim($row[1]) : ''; + $action = isset($row[2]) ? trim($row[2]) : ''; + $status = isset($row[3]) ? trim($row[3]) : ''; + $description = isset($row[4]) ? trim($row[4]) : ''; + } + + + $isValid = true; + if ($filter['workspace'] != 'ALL' && $workspace != $filter['workspace']) { + $isValid = false; + } + if ($filter['status'] != 'ALL') { + switch ($filter['status']) { + case 'COMPLETED': + if ($status != 'action') { + $isValid = false; + } + break; + case 'FAILED': + if ($status == 'action') { + $isValid = false; + } + break; + } + } + + $mktDate = !empty($date) ? $this->mktimeDate($date) : 0; + if (!empty($filter['dateFrom']) && $mktDate > 0) { + if (!($this->mktimeDate($filter['dateFrom']) <= $mktDate)) { + $isValid = false; + } + } + if (!empty($filter['dateTo']) && $mktDate > 0) { + if (!($mktDate <= $this->mktimeDate($filter['dateTo'] . ' 23:59:59'))) { + $isValid = false; + } + } + + if ($isValid) { + return [ + 'DATE' => $date, + 'ACTION' => $action, + 'STATUS' => $status, + 'DESCRIPTION' => $description + ]; + } + return null; + } + + /** + * Create a timestamp from a string value. + * + * @param string $date + * @return int|false + */ + public function mktimeDate($date) + { + $array = getdate(strtotime($date)); + $mktime = mktime($array['hours'], $array['minutes'], $array['seconds'], $array['mon'], $array['mday'], $array['year']); + return $mktime; + } +} diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php b/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php index 2ea868a00..387257903 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php @@ -1,8 +1,15 @@ loadByName($tableName); @@ -122,13 +129,7 @@ class ReportTable array_multisort($primaryKeyColumn, SORT_ASC, $contentData); foreach ($contentData as $row) { - $arrayResult = $this->createRecord( - [ - 'id' => $arrayAdditionalTableData['ADD_TAB_UID'], - 'rows' => base64_encode(serialize($row)), - ], - 'base64' - ); + $arrayResult = $this->createRecord(['id' => $arrayAdditionalTableData['ADD_TAB_UID'], 'rows' => base64_encode(serialize($row)),], 'base64'); if (!$arrayResult['success']) { $errors .= $arrayResult['message']; @@ -141,7 +142,7 @@ class ReportTable //Return return $errors; - } catch (\Exception $e) { + } catch (Exception $e) { throw $e; } } @@ -157,21 +158,20 @@ class ReportTable public function createRecord(array $arrayData, $codification = 'json') { try { - $additionalTable = new \AdditionalTables(); + $additionalTable = new AdditionalTables(); $arrayAdditionalTableData = $additionalTable->load($arrayData['id'], true); $additionalTableClassName = $arrayAdditionalTableData['ADD_TAB_CLASS_NAME']; $additionalTableClassPeerName = $additionalTableClassName . 'Peer'; - $row = ($codification == 'base64')? - unserialize(base64_decode($arrayData['rows'])) : \G::json_decode($arrayData['rows']); - $row = (array)($row); + $row = ($codification == 'base64') ? unserialize(base64_decode($arrayData['rows'])) : G::json_decode($arrayData['rows']); + $row = (array) ($row); $row = array_merge(array_change_key_case($row, CASE_LOWER), array_change_key_case($row, CASE_UPPER)); $flagSave = false; if (!file_exists(PATH_WORKSPACE . 'classes' . PATH_SEP . $additionalTableClassName . '.php')) { - throw new Exception(\G::LoadTranslation('ID_PMTABLE_CLASS_DOESNT_EXIST', [$additionalTableClassName])); + throw new Exception(G::LoadTranslation('ID_PMTABLE_CLASS_DOESNT_EXIST', [$additionalTableClassName])); } require_once(PATH_WORKSPACE . 'classes' . PATH_SEP . $additionalTableClassName . '.php'); @@ -188,17 +188,13 @@ class ReportTable $primaryKeysValues = []; foreach ($additionalTable->getPrimaryKeys() as $primaryKey) { - $method = 'get' . \AdditionalTables::getPHPName($primaryKey['FLD_NAME']); + $method = 'get' . AdditionalTables::getPHPName($primaryKey['FLD_NAME']); $primaryKeysValues[] = $obj->$method(); } - $index = \G::encrypt(implode(',', $primaryKeysValues), 'pmtable'); + $index = G::encrypt(implode(',', $primaryKeysValues), 'pmtable'); - \G::auditLog( - 'AddDataPmtable', - 'Table Name: ' . $arrayAdditionalTableData['ADD_TAB_NAME'] . - ' Table ID: (' . $arrayAdditionalTableData['ADD_TAB_UID'] . ')' - ); + G::auditLog('AddDataPmtable', 'Table Name: ' . $arrayAdditionalTableData['ADD_TAB_NAME'] . ' Table ID: (' . $arrayAdditionalTableData['ADD_TAB_UID'] . ')'); $flagSave = true; } else { @@ -208,10 +204,7 @@ class ReportTable $msg .= $objValidationFailure->getMessage() . "\n"; } - throw new Exception( - \G::LoadTranslation('ID_ERROR_TRYING_INSERT') . - '"' . $arrayAdditionalTableData['ADD_TAB_NAME'] . "\"\n" . $msg - ); + throw new Exception(G::LoadTranslation('ID_ERROR_TRYING_INSERT') . '"' . $arrayAdditionalTableData['ADD_TAB_NAME'] . "\"\n" . $msg); } } else { $flagSave = false; @@ -220,11 +213,11 @@ class ReportTable //Return return [ 'success' => $flagSave, - 'message' => ($flagSave)? \G::LoadTranslation('ID_RECORD_SAVED_SUCCESFULLY') : '', - 'rows' => ($flagSave)? $obj->toArray(\BasePeer::TYPE_FIELDNAME) : [], - 'index' => ($flagSave)? $index : '', + 'message' => ($flagSave) ? G::LoadTranslation('ID_RECORD_SAVED_SUCCESFULLY') : '', + 'rows' => ($flagSave) ? $obj->toArray(\BasePeer::TYPE_FIELDNAME) : [], + 'index' => ($flagSave) ? $index : '', ]; - } catch (\Exception $e) { + } catch (Exception $e) { throw $e; } } @@ -240,13 +233,8 @@ class ReportTable * * @return array */ - public function checkPmtFileThrowErrors( - array $arrayTableSchema, - $processUid, - $flagFromAdmin, - $flagOverwrite, - $postProUid - ) { + public function checkPmtFileThrowErrors(array $arrayTableSchema, $processUid, $flagFromAdmin, $flagOverwrite, $postProUid) + { try { $arrayError = []; @@ -254,7 +242,7 @@ class ReportTable $processMap = new \ProcessMap(); $arrayProcessUid = []; - foreach (\G::json_decode($processMap->getAllProcesses()) as $value) { + foreach (G::json_decode($processMap->getAllProcesses()) as $value) { if ($value->value != '') { $arrayProcessUid[] = $value->value; } @@ -266,19 +254,19 @@ class ReportTable $contentSchema = $value; //The table exists? - $additionalTable = new \AdditionalTables(); + $additionalTable = new AdditionalTables(); $arrayAdditionalTableData = $additionalTable->loadByName($contentSchema['ADD_TAB_NAME']); - $tableProUid = (isset($contentSchema['PRO_UID']))? $contentSchema['PRO_UID'] : $postProUid; - $flagIsPmTable = ($contentSchema['PRO_UID'] == '')? true : false; + $tableProUid = (isset($contentSchema['PRO_UID'])) ? $contentSchema['PRO_UID'] : $postProUid; + $flagIsPmTable = ($contentSchema['PRO_UID'] == '') ? true : false; if ($flagFromAdmin) { if ($flagIsPmTable) { if ($arrayAdditionalTableData && !$flagOverwrite) { $arrayError[$i]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; $arrayError[$i]['ERROR_TYPE'] = 1; //ERROR_PM_TABLES_OVERWRITE - $arrayError[$i]['ERROR_MESS'] = \G::LoadTranslation('ID_OVERWRITE_PMTABLE', [$contentSchema['ADD_TAB_NAME']]); + $arrayError[$i]['ERROR_MESS'] = G::LoadTranslation('ID_OVERWRITE_PMTABLE', [$contentSchema['ADD_TAB_NAME']]); $arrayError[$i]['IS_PMTABLE'] = $flagIsPmTable; $arrayError[$i]['PRO_UID'] = $tableProUid; } @@ -286,14 +274,14 @@ class ReportTable if (!in_array($tableProUid, $arrayProcessUid)) { $arrayError[$i]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; $arrayError[$i]['ERROR_TYPE'] = 2; //ERROR_PROCESS_NOT_EXIST - $arrayError[$i]['ERROR_MESS'] = \G::LoadTranslation('ID_PROCESS_NOT_EXIST', [$contentSchema['ADD_TAB_NAME']]); + $arrayError[$i]['ERROR_MESS'] = G::LoadTranslation('ID_PROCESS_NOT_EXIST', [$contentSchema['ADD_TAB_NAME']]); $arrayError[$i]['IS_PMTABLE'] = $flagIsPmTable; $arrayError[$i]['PRO_UID'] = $tableProUid; } else { if ($arrayAdditionalTableData && !$flagOverwrite) { $arrayError[$i]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; $arrayError[$i]['ERROR_TYPE'] = 3; //ERROR_RP_TABLES_OVERWRITE - $arrayError[$i]['ERROR_MESS'] = \G::LoadTranslation('ID_OVERWRITE_RPTABLE', [$contentSchema['ADD_TAB_NAME']]); + $arrayError[$i]['ERROR_MESS'] = G::LoadTranslation('ID_OVERWRITE_RPTABLE', [$contentSchema['ADD_TAB_NAME']]); $arrayError[$i]['IS_PMTABLE'] = $flagIsPmTable; $arrayError[$i]['PRO_UID'] = $tableProUid; } @@ -303,21 +291,21 @@ class ReportTable if ($flagIsPmTable) { $arrayError[$i]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; $arrayError[$i]['ERROR_TYPE'] = 4; //ERROR_NO_REPORT_TABLE - $arrayError[$i]['ERROR_MESS'] = \G::LoadTranslation('ID_NO_REPORT_TABLE', [$contentSchema['ADD_TAB_NAME']]); + $arrayError[$i]['ERROR_MESS'] = G::LoadTranslation('ID_NO_REPORT_TABLE', [$contentSchema['ADD_TAB_NAME']]); $arrayError[$i]['IS_PMTABLE'] = $flagIsPmTable; $arrayError[$i]['PRO_UID'] = $tableProUid; } else { if ($tableProUid !== $processUid) { $arrayError[$i]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; $arrayError[$i]['ERROR_TYPE'] = 5; //ERROR_OVERWRITE_RELATED_PROCESS - $arrayError[$i]['ERROR_MESS'] = \G::LoadTranslation('ID_OVERWRITE_RELATED_PROCESS', [$contentSchema['ADD_TAB_NAME']]); + $arrayError[$i]['ERROR_MESS'] = G::LoadTranslation('ID_OVERWRITE_RELATED_PROCESS', [$contentSchema['ADD_TAB_NAME']]); $arrayError[$i]['IS_PMTABLE'] = $flagIsPmTable; $arrayError[$i]['PRO_UID'] = $tableProUid; } else { if ($arrayAdditionalTableData && !$flagOverwrite) { $arrayError[$i]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; $arrayError[$i]['ERROR_TYPE'] = 3; //ERROR_RP_TABLES_OVERWRITE - $arrayError[$i]['ERROR_MESS'] = \G::LoadTranslation('ID_OVERWRITE_RPTABLE', [$contentSchema['ADD_TAB_NAME']]); + $arrayError[$i]['ERROR_MESS'] = G::LoadTranslation('ID_OVERWRITE_RPTABLE', [$contentSchema['ADD_TAB_NAME']]); $arrayError[$i]['IS_PMTABLE'] = $flagIsPmTable; $arrayError[$i]['PRO_UID'] = $tableProUid; } @@ -330,7 +318,7 @@ class ReportTable //Return return $arrayError; - } catch (\Exception $e) { + } catch (Exception $e) { throw $e; } } @@ -351,9 +339,9 @@ class ReportTable $additionalTableUid = $arrayData['REP_TAB_UID']; $flagNew = 0; - $additionalTables = \AdditionalTablesPeer::retrieveByPK($arrayData['REP_TAB_UID']); + $additionalTables = AdditionalTablesPeer::retrieveByPK($arrayData['REP_TAB_UID']); - if (!is_null($additionalTables)){ + if (!is_null($additionalTables)) { $arrayData['REP_TAB_NAME'] = 'PMT_' . trim($arrayData['REP_TAB_NAME']); if ($additionalTables->getAddTabName() != $arrayData['REP_TAB_NAME']) { @@ -365,7 +353,7 @@ class ReportTable ob_start(); $arrayData['PRO_UID'] = trim($arrayData['PRO_UID']); - $arrayData['columns'] = \G::json_decode(stripslashes($arrayData['columns'])); //Decofing data columns + $arrayData['columns'] = G::json_decode(stripslashes($arrayData['columns'])); //Decofing data columns if ($flagNew == 1) { $arrayNewColumn = []; @@ -387,27 +375,27 @@ class ReportTable $arrayData['columns'] = $arrayNewColumn; } - $additionalTable = new \AdditionalTables(); + $additionalTable = new AdditionalTables(); $repTabClassName = $additionalTable->getPHPName($arrayData['REP_TAB_NAME']); - $flagIsReportTable = ($arrayData['PRO_UID'] != '')? true : false; + $flagIsReportTable = ($arrayData['PRO_UID'] != '') ? true : false; $columns = $arrayData['columns']; //Reserved Words Table $reservedWords = [ - 'ALTER', 'CLOSE', 'COMMIT', 'CREATE','DECLARE','DELETE','DROP','FETCH','FUNCTION','GRANT','INDEX', - 'INSERT','OPEN','REVOKE','ROLLBACK','SELECT','SYNONYM','TABLE','UPDATE','VIEW','APP_UID','ROW','PMTABLE' + 'ALTER', 'CLOSE', 'COMMIT', 'CREATE', 'DECLARE', 'DELETE', 'DROP', 'FETCH', 'FUNCTION', 'GRANT', 'INDEX', + 'INSERT', 'OPEN', 'REVOKE', 'ROLLBACK', 'SELECT', 'SYNONYM', 'TABLE', 'UPDATE', 'VIEW', 'APP_UID', 'ROW', 'PMTABLE' ]; //Reserved Words Field $reservedWordsPhp = [ - 'case','catch','cfunction','class','clone','const','continue','declare','default','do','else','elseif', - 'enddeclare','endfor','endforeach','endif','endswitch','endwhile','extends','final','for','foreach', - 'function','global','goto','if','implements','interface','instanceof','private','namespace','new', - 'old_function','or','throw','protected','public','static','switch','xor','try','use','var','while' + 'case', 'catch', 'cfunction', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'do', 'else', 'elseif', + 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'extends', 'final', 'for', 'foreach', + 'function', 'global', 'goto', 'if', 'implements', 'interface', 'instanceof', 'private', 'namespace', 'new', + 'old_function', 'or', 'throw', 'protected', 'public', 'static', 'switch', 'xor', 'try', 'use', 'var', 'while' ]; - $reservedWordsSql = \G::reservedWordsSql(); + $reservedWordsSql = G::reservedWordsSql(); //Verify if exists if ($arrayData['REP_TAB_UID'] == '' || (isset($arrayData['forceUid']) && $arrayData['forceUid'])) { @@ -419,23 +407,25 @@ class ReportTable } //Validations - if ($additionalTable->loadByName($arrayData['REP_TAB_NAME'])) { - throw new \Exception(\G::LoadTranslation('ID_PMTABLE_ALREADY_EXISTS', [$arrayData['REP_TAB_NAME']])); + if (is_array($additionalTable->loadByName($arrayData['REP_TAB_NAME']))) { + throw new Exception(G::LoadTranslation('ID_PMTABLE_ALREADY_EXISTS', [$arrayData['REP_TAB_NAME']])); } if (in_array(strtoupper($arrayData['REP_TAB_NAME']), $reservedWords) || - in_array(strtoupper($arrayData['REP_TAB_NAME']), $reservedWordsSql) + in_array(strtoupper($arrayData['REP_TAB_NAME']), $reservedWordsSql) ) { - throw new \Exception(\G::LoadTranslation('ID_PMTABLE_INVALID_NAME', [$arrayData['REP_TAB_NAME']])); + throw new Exception(G::LoadTranslation('ID_PMTABLE_INVALID_NAME', [$arrayData['REP_TAB_NAME']])); } } + $this->validateFieldName($columns); + //Backward compatility foreach ($columns as $i => $column) { if (in_array(strtoupper($columns[$i]->field_name), $reservedWordsSql) || - in_array(strtolower($columns[$i]->field_name), $reservedWordsPhp) + in_array(strtolower($columns[$i]->field_name), $reservedWordsPhp) ) { - throw new \Exception(\G::LoadTranslation('ID_PMTABLE_INVALID_FIELD_NAME', [$columns[$i]->field_name])); + throw new Exception(G::LoadTranslation('ID_PMTABLE_INVALID_FIELD_NAME', [$columns[$i]->field_name])); } switch ($column->field_type) { @@ -475,19 +465,19 @@ class ReportTable } $pmTable->build(); - + $buildResult = ob_get_contents(); ob_end_clean(); //Updating additional table struture information $addTabData = [ - 'ADD_TAB_UID' => $arrayData['REP_TAB_UID'], + 'ADD_TAB_UID' => $arrayData['REP_TAB_UID'], 'ADD_TAB_NAME' => $arrayData['REP_TAB_NAME'], - 'ADD_TAB_CLASS_NAME' => $repTabClassName, + 'ADD_TAB_CLASS_NAME' => $repTabClassName, 'ADD_TAB_DESCRIPTION' => $arrayData['REP_TAB_DSC'], 'ADD_TAB_PLG_UID' => '', - 'DBS_UID' => ($arrayData['REP_TAB_CONNECTION'])? $arrayData['REP_TAB_CONNECTION'] : 'workflow', + 'DBS_UID' => ($arrayData['REP_TAB_CONNECTION']) ? $arrayData['REP_TAB_CONNECTION'] : 'workflow', 'PRO_UID' => $arrayData['PRO_UID'], 'ADD_TAB_TYPE' => $arrayData['REP_TAB_TYPE'], 'ADD_TAB_GRID' => $arrayData['REP_TAB_GRID'] @@ -514,37 +504,30 @@ class ReportTable foreach ($columns as $i => $column) { $field->create([ - 'FLD_UID' => $column->uid, - 'FLD_INDEX' => $i, + 'FLD_UID' => $column->uid, + 'FLD_INDEX' => $i, 'ADD_TAB_UID' => $addTabUid, 'FLD_NAME' => $column->field_name, 'FLD_DESCRIPTION' => $column->field_label, 'FLD_TYPE' => $column->field_type, - 'FLD_SIZE' => ($column->field_size == '')? null : $column->field_size, - 'FLD_NULL' => ($column->field_null)? 1 : 0, - 'FLD_AUTO_INCREMENT' => ($column->field_autoincrement)? 1 : 0, - 'FLD_KEY' => ($column->field_key)? 1 : 0, - 'FLD_TABLE_INDEX' => (isset($column->field_index) && $column->field_index)? 1 : 0, + 'FLD_SIZE' => ($column->field_size == '') ? null : $column->field_size, + 'FLD_NULL' => ($column->field_null) ? 1 : 0, + 'FLD_AUTO_INCREMENT' => ($column->field_autoincrement) ? 1 : 0, + 'FLD_KEY' => ($column->field_key) ? 1 : 0, + 'FLD_TABLE_INDEX' => (isset($column->field_index) && $column->field_index) ? 1 : 0, 'FLD_FOREIGN_KEY' => 0, 'FLD_FOREIGN_KEY_TABLE' => '', 'FLD_DYN_NAME' => $column->field_dyn, - 'FLD_DYN_UID' => $column->field_uid, - 'FLD_FILTER' => (isset($column->field_filter) && $column->field_filter)? 1 : 0 + 'FLD_DYN_UID' => $column->field_uid, + 'FLD_FILTER' => (isset($column->field_filter) && $column->field_filter) ? 1 : 0 ]); } if ($flagIsReportTable && $flagAlterTable) { //The table was create successfully but we're catching problems while populating table try { - $additionalTable->populateReportTable( - $arrayData['REP_TAB_NAME'], - $pmTable->getDataSource(), - $arrayData['REP_TAB_TYPE'], - $arrayData['PRO_UID'], - $arrayData['REP_TAB_GRID'], - $addTabUid - ); - } catch (\Exception $e) { + $additionalTable->populateReportTable($arrayData['REP_TAB_NAME'], $pmTable->getDataSource(), $arrayData['REP_TAB_TYPE'], $arrayData['PRO_UID'], $arrayData['REP_TAB_GRID'], $addTabUid); + } catch (Exception $e) { $result->message = $result->msg = $e->getMessage(); } } @@ -561,10 +544,7 @@ class ReportTable } } - \G::auditLog( - (isset($arrayData['REP_TAB_UID']) && $arrayData['REP_TAB_UID'] == '')? - 'CreatePmtable' : 'UpdatePmtable', 'Fields: ' . $fieldsName - ); + G::auditLog((isset($arrayData['REP_TAB_UID']) && $arrayData['REP_TAB_UID'] == '') ? 'CreatePmtable' : 'UpdatePmtable', 'Fields: ' . $fieldsName); $result->success = true; $result->message = $result->msg = $buildResult; @@ -575,12 +555,12 @@ class ReportTable $pmTablesProxy = new \pmTablesProxy(); $obj = new \stdClass(); - $obj->rows = \G::json_encode([['id' => $additionalTableUid, 'type' => '']]); + $obj->rows = G::json_encode([['id' => $additionalTableUid, 'type' => '']]); //Delete Report Table $resultDeleteReportTable = $pmTablesProxy->delete($obj); } - } catch (\Exception $e) { + } catch (Exception $e) { $buildResult = ob_get_contents(); ob_end_clean(); @@ -593,7 +573,7 @@ class ReportTable $result->type = ucfirst($pmTable->getDbConfig()->adapter); } else { $result->message = $result->msg = $e->getMessage(); - $result->type = \G::LoadTranslation('ID_EXCEPTION'); + $result->type = G::LoadTranslation('ID_EXCEPTION'); } $result->trace = $e->getTraceAsString(); @@ -616,15 +596,8 @@ class ReportTable * * @return string */ - public function createStructureOfTables( - array $arrayTableSchema, - array $arrayTableData, - $processUid, - $flagFromAdmin, - $flagOverwrite = true, - array $arrayTablesToExclude = [], - array $arrayTablesToCreate = [] - ) { + public function createStructureOfTables(array $arrayTableSchema, array $arrayTableData, $processUid, $flagFromAdmin, $flagOverwrite = true, array $arrayTablesToExclude = [], array $arrayTablesToCreate = []) + { try { $errors = ''; @@ -636,7 +609,7 @@ class ReportTable $contentSchema = $value; if (!in_array($contentSchema['ADD_TAB_NAME'], $arrayTablesToExclude)) { - $additionalTable = new \AdditionalTables(); + $additionalTable = new AdditionalTables(); $arrayAdditionalTableData = $additionalTable->loadByName($contentSchema['ADD_TAB_NAME']); @@ -644,7 +617,7 @@ class ReportTable $tableData = new \stdClass(); - if (isset( $contentSchema['PRO_UID'] )) { + if (isset($contentSchema['PRO_UID'])) { $tableData->PRO_UID = $contentSchema['PRO_UID']; } else { $tableData->PRO_UID = $_POST['form']['PRO_UID']; @@ -673,9 +646,9 @@ class ReportTable //renaming... $tNameOld = $contentSchema['ADD_TAB_NAME']; $newTableName = $contentSchema['ADD_TAB_NAME'] . '_' . date('YmdHis'); - $contentSchema['ADD_TAB_UID'] = \G::generateUniqueID(); + $contentSchema['ADD_TAB_UID'] = G::generateUniqueID(); $contentSchema['ADD_TAB_NAME'] = $newTableName; - $contentSchema['ADD_TAB_CLASS_NAME'] = \AdditionalTables::getPHPName($newTableName); + $contentSchema['ADD_TAB_CLASS_NAME'] = AdditionalTables::getPHPName($newTableName); //Mapping the table name for posterior uses $tableNameMap[$tNameOld] = $contentSchema['ADD_TAB_NAME']; @@ -691,17 +664,17 @@ class ReportTable foreach ($contentSchema['FIELDS'] as $field) { $columns[] = [ - 'uid' => '', - 'field_uid' => '', - 'field_name' => $field['FLD_NAME'], - 'field_dyn' => (isset($field['FLD_DYN_NAME']))? $field['FLD_DYN_NAME'] : '', - 'field_label' => (isset($field['FLD_DESCRIPTION']))? $field['FLD_DESCRIPTION'] : '', - 'field_type' => $field['FLD_TYPE'], - 'field_size' => $field['FLD_SIZE'], - 'field_key' => (isset($field['FLD_KEY']))? $field['FLD_KEY'] : 0, - 'field_null' => (isset($field['FLD_NULL']))? $field['FLD_NULL'] : 1, - 'field_autoincrement' => (isset($field['FLD_AUTO_INCREMENT']))? - $field['FLD_AUTO_INCREMENT'] : 0 + 'uid' => '', + 'field_uid' => '', + 'field_name' => $field['FLD_NAME'], + 'field_dyn' => (isset($field['FLD_DYN_NAME'])) ? $field['FLD_DYN_NAME'] : '', + 'field_label' => (isset($field['FLD_DESCRIPTION'])) ? $field['FLD_DESCRIPTION'] : '', + 'field_type' => $field['FLD_TYPE'], + 'field_size' => $field['FLD_SIZE'], + 'field_key' => (isset($field['FLD_KEY'])) ? $field['FLD_KEY'] : 0, + 'field_null' => (isset($field['FLD_NULL'])) ? $field['FLD_NULL'] : 1, + 'field_autoincrement' => (isset($field['FLD_AUTO_INCREMENT'])) ? + $field['FLD_AUTO_INCREMENT'] : 0 ]; } @@ -709,23 +682,21 @@ class ReportTable $tableData->REP_TAB_NAME = $contentSchema['ADD_TAB_NAME']; $tableData->REP_TAB_DSC = $contentSchema['ADD_TAB_DESCRIPTION']; $tableData->REP_TAB_CONNECTION = $contentSchema['DBS_UID']; - $tableData->REP_TAB_TYPE = (isset($contentSchema['ADD_TAB_TYPE']))? $contentSchema['ADD_TAB_TYPE'] : ''; - $tableData->REP_TAB_GRID = (isset($contentSchema['ADD_TAB_GRID']))? $contentSchema['ADD_TAB_GRID'] : ''; - $tableData->columns = \G::json_encode($columns); + $tableData->REP_TAB_TYPE = (isset($contentSchema['ADD_TAB_TYPE'])) ? $contentSchema['ADD_TAB_TYPE'] : ''; + $tableData->REP_TAB_GRID = (isset($contentSchema['ADD_TAB_GRID'])) ? $contentSchema['ADD_TAB_GRID'] : ''; + $tableData->columns = G::json_encode($columns); $tableData->forceUid = true; //Save the table $alterTable = false; - $result = $this->saveStructureOfTable((array)($tableData), $alterTable); + $result = $this->saveStructureOfTable((array) ($tableData), $alterTable); if ($result->success) { - \G::auditLog( - 'ImportTable', $contentSchema['ADD_TAB_NAME'] . ' (' . $contentSchema['ADD_TAB_UID'] . ')' - ); + G::auditLog('ImportTable', $contentSchema['ADD_TAB_NAME'] . ' (' . $contentSchema['ADD_TAB_UID'] . ')'); $processQueueTables[$contentSchema['DBS_UID']][] = $contentSchema['ADD_TAB_NAME']; } else { - $errors .= \G::LoadTranslation('ID_ERROR_CREATE_TABLE') . $tableData->REP_TAB_NAME . '-> ' . $result->message . '\n\n'; + $errors .= G::LoadTranslation('ID_ERROR_CREATE_TABLE') . $tableData->REP_TAB_NAME . '-> ' . $result->message . '\n\n'; } } } @@ -747,9 +718,38 @@ class ReportTable //Return return $errors; - } catch (\Exception $e) { + } catch (Exception $e) { throw $e; } } -} + /** + * Throw an exception if the column is not valid for the creation of the field + * in the classes managed by propel. + * + * @param array $columns + * @throws Exception + */ + private function validateFieldName($columns) + { + $validFields = []; + $invalidFields = []; + foreach ($columns as $column) { + try { + $fieldName = $column->field_name; + Validator::isValidVariableName($fieldName); + $fieldName = strtolower(AdditionalTables::getPHPName($fieldName)); + if (in_array($fieldName, $validFields)) { + $invalidFields[] = $fieldName; + } else { + $validFields[] = $fieldName; + } + } catch (Exception $e) { + $invalidFields[] = $fieldName; + } + } + if (!empty($invalidFields)) { + throw new Exception(G::LoadTranslation('ID_PMTABLE_INVALID_FIELD_NAME_VARIABLE', $invalidFields)); + } + } +} diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Table.php b/workflow/engine/src/ProcessMaker/BusinessModel/Table.php index c7f5b2e1e..7f85689d6 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Table.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Table.php @@ -1,10 +1,12 @@ - * @copyright Colosa - Bolivia + * @deprecated Method deprecated in Release 3.3.1 * * @return array + * @throws Exception */ public function saveTable($tab_data, $pro_uid = '', $reportFlag = false, $createRep = true) { @@ -508,59 +511,163 @@ class Table } /** - * Update Data for Table - * @var string $tab_data. Data for table - * @var string $pro_uid. Uid for process - * @var string $reportFlag. If is report table + * Update Data for PmTable and Report Table * - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia + * @var string $tableData: Data for table + * @var string $pro_uid: Uid for process + * @var boolean $isReportTable: If is report table * - * @return void + * @return object + * @throws Exception */ - public function updateTable($tab_data, $pro_uid = '', $reportFlag = false) + public function updateTable($tableData, $proUid = '', $isReportTable = false) { - if ($reportFlag) { - $tab_uid = $tab_data['rep_uid']; - $pro_uid = $this->validateProUid($pro_uid); + $tableDsc = false; + $tableFields = false; + if ($isReportTable) { + $tabUid = $tableData['rep_uid']; + $proUid = $this->validateProUid($proUid); + $tableData['pro_uid'] = $proUid; + $errorMssg = "The property rep_uid: '$tabUid' is incorrect."; } else { - $tab_uid = $tab_data['pmt_uid']; + $tabUid = $tableData['pmt_uid']; + $errorMssg = "The property pmt_uid: '$tabUid' is incorrect."; + } + $tabUid = $this->validateTabUid($tabUid, $isReportTable); + $addTables = new AdditionalTables(); + $dataValidate = $addTables->getTableProperties($tabUid, $tableData, $isReportTable); + if (empty($dataValidate)) { + throw (new Exception($errorMssg)); + } + if ($isReportTable) { + if (!empty($tableData['rep_tab_dsc'])) { + $dataValidate['rep_tab_dsc'] = $tableData['rep_tab_dsc']; + $tableDsc = true; + } + } else { + if (!empty($tableData['pmt_tab_dsc'])) { + $dataValidate['rep_tab_dsc'] = $tableData['pmt_tab_dsc']; + $tableDsc = true; + } + } + if (!empty($tableData['fields'])) { + $dataValidate['fields'] = $tableData['fields']; + $tableFields = true; + } else { + throw (new Exception('Body doesn\'t contain fields arguments')); + } + if (!$tableDsc && !$tableFields) { + throw (new Exception('Body doesn\'t contain pmt_tad_dsc or fields arguments')); } - $tab_uid = $this->validateTabUid($tab_uid, $reportFlag); - $dataValidate = array(); - $oCriteria = new \Criteria('workflow'); - $oCriteria->add(\AdditionalTablesPeer::ADD_TAB_UID, $tab_uid, \Criteria::EQUAL); - $oDataset = \AdditionalTablesPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + //We will validate the fields after update the pmTable structure + $result = $this->validateTableBeforeUpdate($dataValidate); - if ($oDataset->next()) { - $row = $oDataset->getRow(); - if ($reportFlag) { - $dataValidate['rep_uid'] = $tab_uid; - $dataValidate['rep_tab_name'] = $row['ADD_TAB_NAME']; - $dataValidate['rep_tab_dsc'] = $tab_data['rep_tab_dsc']; - $dataValidate['rep_tab_connection'] = $row['DBS_UID']; - $dataValidate['rep_tab_type'] = $row['ADD_TAB_TYPE']; - $dataValidate['rep_tab_grid'] = ''; - if (strpos($row['ADD_TAB_GRID'], '-')) { - list($gridName, $gridId) = explode( '-', $row['ADD_TAB_GRID'] ); - $dataValidate['rep_tab_grid'] = $gridId; + return $result; + } + + /** + * Will be validate the fields before saveStructureOfTable + * + * @param array $tableFields Properties for table + * + * @return object + * @throws Exception + */ + public function validateTableBeforeUpdate($tableFields) + { + $propertiesUpdate = []; + if (!empty($tableFields)){ + $propertiesUpdate = array_change_key_case($tableFields, CASE_UPPER); + $propertiesUpdate['keepData'] = '1'; + } + + $columnsTable = []; + $flagKey = false; + if (!empty($propertiesUpdate['FIELDS'])) { + $columns = $propertiesUpdate['FIELDS']; + foreach ($columns as $i => $column) { + $columnsTable[$i] = []; + //Required fld_uid + if (!empty($columns[$i]['fld_uid'])) { + $columnsTable[$i]['field_uid'] = $columnsTable[$i]['uid'] = G::toUpper($columns[$i]['fld_uid']); + } else { + throw (new Exception(G::LoadTranslation("ID_CAN_NOT_BE_EMPTY", ['fld_uid']))); } - } else { - $dataValidate['pmt_uid'] = $tab_uid; - $dataValidate['pmt_tab_name'] = $row['ADD_TAB_NAME']; - $dataValidate['pmt_tab_dsc'] = $tab_data['pmt_tab_dsc']; - } - $dataValidate['fields'] = $tab_data['fields']; - } else { - if ($reportFlag) { - throw (new \Exception("The property rep_uid: '$tab_uid' is incorrect.")); - } else { - throw (new \Exception("The property pmt_uid: '$tab_uid' is incorrect.")); + //Not required fld_dyn + $columnsTable[$i]['field_dyn'] = ''; + if (!empty($columns[$i]['fld_dyn'])) { + $columnsTable[$i]['field_dyn'] = G::toUpper($columns[$i]['fld_dyn']); + } + //Required fld_name + if (!empty($columns[$i]['fld_name'])) { + $columnsTable[$i]['field_name'] = G::toUpper($columns[$i]['fld_name']); + } else { + throw (new Exception(G::LoadTranslation("ID_CAN_NOT_BE_EMPTY", ['fld_name']))); + } + //Required fld_label + if (!empty($columns[$i]['fld_label'])) { + $columnsTable[$i]['field_label'] = G::toUpper($columns[$i]['fld_label']); + } else { + throw (new Exception(G::LoadTranslation("ID_CAN_NOT_BE_EMPTY", ['fld_label']))); + } + + //We will to define the autoincrement + $columnsTable[$i]['field_autoincrement'] = false; + + //Required fld_type + if (!empty($columns[$i]['fld_type'])) { + $columnsTable[$i]['field_type'] = G::toUpper($columns[$i]['fld_type']); + //Will be validate if is the correct type of column + if (!in_array($columnsTable[$i]['field_type'], AdditionalTables::FLD_TYPE_VALUES)) { + throw (new Exception("The property fld_type: '" . $columns[$i]['fld_type'] . "' is incorrect.")); + } + //Will be review if the column type has the correct definition with autoincrement + if (!empty($columns[$i]['fld_autoincrement']) && $columns[$i]['fld_autoincrement']) { + if ($columns[$i]['fld_key'] && in_array($columns[$i]['fld_type'], AdditionalTables::FLD_TYPE_WITH_AUTOINCREMENT)) { + $columnsTable[$i]['field_autoincrement'] = true; + } else { + throw (new Exception("The property field_autoincrement: '" . $columns[$i]['fld_autoincrement'] . "' is incorrect. ")); + } + } + } else { + throw (new Exception(G::LoadTranslation("ID_CAN_NOT_BE_EMPTY", ['fld_type']))); + } + //Required fld_size depends of fld_type + $columnsTable[$i]['field_size'] = 0; + if (in_array($columns[$i]['fld_type'], AdditionalTables::FLD_TYPE_WITH_SIZE)) { + if (empty($columns[$i]['fld_size'])) { + throw (new Exception(G::LoadTranslation("ID_CAN_NOT_BE_EMPTY", ['fld_size']))); + } + if ((integer)$columns[$i]['fld_size'] === 0) { + throw (new Exception("The property fld_size: '" . $columns[$i]['fld_size'] . "' is incorrect.")); + } + $columnsTable[$i]['field_size'] = (integer)$columns[$i]['fld_size']; + } + //Required only for one column + $columnsTable[$i]['field_key'] = false; + if (!empty($columns[$i]['fld_key'])) { + $flagKey = true; + $columnsTable[$i]['field_key'] = (boolean)$columns[$i]['fld_key']; + } + //Not required fld_null + $columnsTable[$i]['field_null'] = false; + if (!empty($columns[$i]['fld_null'])) { + $columnsTable[$i]['field_null'] = G::toUpper($columns[$i]['fld_null']); + } + //Not required fld_filter + $columnsTable[$i]['field_filter'] = false; } } - $this->saveTable($dataValidate, $pro_uid, $reportFlag, false); + if (!$flagKey) { + throw (new Exception("The table doesn't have a primary key 'fld_key'")); + } + + $propertiesUpdate['columns'] = G::json_encode($columnsTable); + $reportTable = new BusinessModelRpt(); + $result = $reportTable->saveStructureOfTable($propertiesUpdate); + + return $result; } /** diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Validator.php b/workflow/engine/src/ProcessMaker/BusinessModel/Validator.php index 5c61055ae..54fde9163 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Validator.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Validator.php @@ -1,6 +1,10 @@ @@ -26,19 +30,19 @@ class Validator { $dep_uid = trim($dep_uid); if ($dep_uid == '') { - throw (new \Exception(\G::LoadTranslation("ID_DEPARTMENT_NOT_EXIST", array($nameField,'')))); + throw (new Exception(G::LoadTranslation("ID_DEPARTMENT_NOT_EXIST", array($nameField, '')))); } $oDepartment = new \Department(); if (!($oDepartment->existsDepartment($dep_uid))) { - throw (new \Exception(\G::LoadTranslation("ID_DEPARTMENT_NOT_EXIST", array($nameField,$dep_uid)))); + throw (new Exception(G::LoadTranslation("ID_DEPARTMENT_NOT_EXIST", array($nameField, $dep_uid)))); } return $dep_uid; } /** * Validate dep_status - * @var string $dep_uid. Uid for Departament - * @var string $nameField. Name of field for message + * @var string $dep_uid . Uid for Departament + * @var string $nameField . Name of field for message * * @access public * @author Brayan Pereyra (Cochalo) @@ -51,7 +55,7 @@ class Validator $dep_status = trim($dep_status); $values = array('ACTIVE', 'INACTIVE'); if (!in_array($dep_status, $values)) { - throw (new \Exception(\G::LoadTranslation("ID_DEPARTMENT_NOT_EXIST", array('dep_status',$dep_status)))); + throw (new Exception(G::LoadTranslation("ID_DEPARTMENT_NOT_EXIST", array('dep_status', $dep_status)))); } return $dep_status; } @@ -59,7 +63,7 @@ class Validator /** * Validate usr_uid * - * @param string $usr_uid, Uid for user + * @param string $usr_uid , Uid for user * @param string $nameField . Name of field for message * * @access public @@ -72,11 +76,11 @@ class Validator { $usr_uid = trim($usr_uid); if ($usr_uid == '') { - throw (new \Exception(\G::LoadTranslation("ID_USER_NOT_EXIST", array($nameField,'')))); + throw (new Exception(G::LoadTranslation("ID_USER_NOT_EXIST", array($nameField, '')))); } $oUsers = new \Users(); if (!($oUsers->userExists($usr_uid))) { - throw (new \Exception(\G::LoadTranslation("ID_USER_NOT_EXIST", array($nameField,$usr_uid)))); + throw (new Exception(G::LoadTranslation("ID_USER_NOT_EXIST", array($nameField, $usr_uid)))); } return $usr_uid; } @@ -84,7 +88,7 @@ class Validator /** * Validate app_uid * - * @param string $app_uid, Uid for application + * @param string $app_uid , Uid for application * @param string $nameField . Name of field for message * * @access public @@ -97,11 +101,11 @@ class Validator { $app_uid = trim($app_uid); if ($app_uid == '') { - throw (new \Exception(\G::LoadTranslation("ID_APPLICATION_NOT_EXIST", array($nameField,'')))); + throw (new Exception(G::LoadTranslation("ID_APPLICATION_NOT_EXIST", array($nameField, '')))); } $oApplication = new \Application(); if (!($oApplication->exists($app_uid))) { - throw (new \Exception(\G::LoadTranslation("ID_APPLICATION_NOT_EXIST", array($nameField,$app_uid)))); + throw (new Exception(G::LoadTranslation("ID_APPLICATION_NOT_EXIST", array($nameField, $app_uid)))); } return $app_uid; } @@ -109,7 +113,7 @@ class Validator /** * Validate app_uid * - * @param string $tri_uid, Uid for trigger + * @param string $tri_uid , Uid for trigger * @param string $nameField . Name of field for message * * @access public @@ -122,11 +126,11 @@ class Validator { $tri_uid = trim($tri_uid); if ($tri_uid == '') { - throw (new \Exception(\G::LoadTranslation("ID_TRIGGER_NOT_EXIST", array($nameField,'')))); + throw (new Exception(G::LoadTranslation("ID_TRIGGER_NOT_EXIST", array($nameField, '')))); } $oTriggers = new \Triggers(); if (!($oTriggers->TriggerExists($tri_uid))) { - throw (new \Exception(\G::LoadTranslation("ID_TRIGGER_NOT_EXIST", array($nameField,$tri_uid)))); + throw (new Exception(G::LoadTranslation("ID_TRIGGER_NOT_EXIST", array($nameField, $tri_uid)))); } return $tri_uid; } @@ -134,7 +138,7 @@ class Validator /** * Validate pro_uid * - * @param string $pro_uid, Uid for process + * @param string $pro_uid , Uid for process * @param string $nameField . Name of field for message * * @access public @@ -147,11 +151,11 @@ class Validator { $pro_uid = trim($pro_uid); if ($pro_uid == '') { - throw (new \Exception(\G::LoadTranslation("ID_PROCESS_NOT_EXIST", array($nameField,'')))); + throw (new Exception(G::LoadTranslation("ID_PROCESS_NOT_EXIST", array($nameField, '')))); } $oProcess = new \Process(); if (!($oProcess->exists($pro_uid))) { - throw (new \Exception(\G::LoadTranslation("ID_PROCESS_NOT_EXIST", array($nameField,$pro_uid)))); + throw (new Exception(G::LoadTranslation("ID_PROCESS_NOT_EXIST", array($nameField, $pro_uid)))); } return $pro_uid; } @@ -159,7 +163,7 @@ class Validator /** * Validate cat_uid * - * @param string $cat_uid, Uid for category + * @param string $cat_uid , Uid for category * @param string $nameField . Name of field for message * * @access public @@ -172,11 +176,11 @@ class Validator { $cat_uid = trim($cat_uid); if ($cat_uid == '') { - throw (new \Exception(\G::LoadTranslation("ID_CATEGORY_NOT_EXIST", array($nameField,'')))); + throw (new Exception(G::LoadTranslation("ID_CATEGORY_NOT_EXIST", array($nameField, '')))); } $oCategory = new \ProcessCategory(); if (!($oCategory->exists($cat_uid))) { - throw (new \Exception(\G::LoadTranslation("ID_CATEGORY_NOT_EXIST", array($nameField,$cat_uid)))); + throw (new Exception(G::LoadTranslation("ID_CATEGORY_NOT_EXIST", array($nameField, $cat_uid)))); } return $cat_uid; } @@ -184,7 +188,7 @@ class Validator /** * Validate date * - * @param string $date, Date for validate + * @param string $date , Date for validate * @param string $nameField . Name of field for message * * @access public @@ -197,18 +201,18 @@ class Validator { $date = trim($date); if ($date == '') { - throw (new \Exception(\G::LoadTranslation("ID_DATE_NOT_VALID", array('',$format)))); + throw (new Exception(G::LoadTranslation("ID_DATE_NOT_VALID", array('', $format)))); } $d = \DateTime::createFromFormat($format, $date); if (!($d && $d->format($format) == $date)) { - throw (new \Exception(\G::LoadTranslation("ID_DATE_NOT_VALID", array($date,$format)))); + throw (new Exception(G::LoadTranslation("ID_DATE_NOT_VALID", array($date, $format)))); } return $date; } /** * Validate is array - * @var array $field. Field type array + * @var array $field . Field type array * * @access public * @author Brayan Pereyra (Cochalo) @@ -219,13 +223,13 @@ class Validator static public function isArray($field, $nameField) { if (!is_array($field)) { - throw (new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_ARRAY", array($nameField)))); + throw (new Exception(G::LoadTranslation("ID_INVALID_VALUE_ARRAY", array($nameField)))); } } /** * Validate is string - * @var array $field. Field type string + * @var array $field . Field type string * * @access public * @author Brayan Pereyra (Cochalo) @@ -236,13 +240,13 @@ class Validator static public function isString($field, $nameField) { if (!is_string($field)) { - throw (new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_STRING", array($nameField)))); + throw (new Exception(G::LoadTranslation("ID_INVALID_VALUE_STRING", array($nameField)))); } } /** * Validate is integer - * @var array $field. Field type integer + * @var array $field . Field type integer * * @access public * @author Brayan Pereyra (Cochalo) @@ -253,13 +257,13 @@ class Validator static public function isInteger($field, $nameField) { if (!is_integer($field)) { - throw (new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_INTEGER", array($nameField)))); + throw (new Exception(G::LoadTranslation("ID_INVALID_VALUE_INTEGER", array($nameField)))); } } /** * Validate is boolean - * @var boolean $field. Field type boolean + * @var boolean $field . Field type boolean * * @access public * @author Brayan Pereyra (Cochalo) @@ -270,13 +274,13 @@ class Validator static public function isBoolean($field, $nameField) { if (!is_bool($field)) { - throw (new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_BOOLEAN", array($nameField)))); + throw (new Exception(G::LoadTranslation("ID_INVALID_VALUE_BOOLEAN", array($nameField)))); } } /** * Validate is boolean - * @var boolean $field. Field type boolean + * @var boolean $field . Field type boolean * * @access public * @author Brayan Pereyra (Cochalo) @@ -287,14 +291,28 @@ class Validator static public function isNotEmpty($field, $nameField) { if (empty($field)) { - throw (new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_IS_EMPTY", array($nameField)))); + throw (new Exception(G::LoadTranslation("ID_INVALID_VALUE_IS_EMPTY", array($nameField)))); + } + } + + /** + * Validate a variable name + * @param $nameField + * @throws \Exception + * @return void + */ + static public function isValidVariableName($nameField) + { + $resp = preg_match(config('constants.validation.pmVariable.regEx'), $nameField, $matches); + if (isset($resp) && $resp === 0) { + throw (new Exception(G::LoadTranslation("ID_INVALID_NAME", array($nameField)))); } } /** * Verify if data is array * - * @param string $data Data + * @param string $data Data * @param string $dataNameForException Data name for the exception * * return void Throw exception if data is not array @@ -303,9 +321,9 @@ class Validator { try { if (!is_array($data)) { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_THIS_MUST_BE_ARRAY", array($dataNameForException))); + throw new Exception(G::LoadTranslation("ID_INVALID_VALUE_THIS_MUST_BE_ARRAY", array($dataNameForException))); } - } catch (\Exception $e) { + } catch (Exception $e) { throw $e; } } @@ -313,7 +331,7 @@ class Validator /** * Verify if data is empty * - * @param string $data Data + * @param string $data Data * @param string $dataNameForException Data name for the exception * * return void Throw exception if data is empty @@ -322,9 +340,9 @@ class Validator { try { if (empty($data)) { - throw new \Exception(\G::LoadTranslation("ID_INVALID_VALUE_CAN_NOT_BE_EMPTY", array($dataNameForException))); + throw new Exception(G::LoadTranslation("ID_INVALID_VALUE_CAN_NOT_BE_EMPTY", array($dataNameForException))); } - } catch (\Exception $e) { + } catch (Exception $e) { throw $e; } } @@ -332,7 +350,7 @@ class Validator /** * Validate data by ISO 8601 format * - * @param mixed $data Data + * @param mixed $data Data * @param mixed $field Fields * * @return void Throw exception if data has an invalid value @@ -352,7 +370,7 @@ class Validator switch (gettype($data)) { case 'string': if (trim($data) != '' && !preg_match('/^' . $regexpIso8601 . '$/', $data)) { - throw new \Exception(\G::LoadTranslation('ID_ISO8601_INVALID_FORMAT', [(!is_null($field) && is_string($field))? $field : $data])); + throw new Exception(G::LoadTranslation('ID_ISO8601_INVALID_FORMAT', [(!is_null($field) && is_string($field)) ? $field : $data])); } break; case 'array': @@ -360,17 +378,17 @@ class Validator foreach ($field as $value) { $fieldName = $value; - $fieldName = (isset($data[strtoupper($fieldName)]))? strtoupper($fieldName) : $fieldName; - $fieldName = (isset($data[strtolower($fieldName)]))? strtolower($fieldName) : $fieldName; + $fieldName = (isset($data[strtoupper($fieldName)])) ? strtoupper($fieldName) : $fieldName; + $fieldName = (isset($data[strtolower($fieldName)])) ? strtolower($fieldName) : $fieldName; if (isset($data[$fieldName]) && trim($data[$fieldName]) != '' && !preg_match('/^' . $regexpIso8601 . '$/', $data[$fieldName])) { - throw new \Exception(\G::LoadTranslation('ID_ISO8601_INVALID_FORMAT', [$fieldName])); + throw new Exception(G::LoadTranslation('ID_ISO8601_INVALID_FORMAT', [$fieldName])); } } } break; } - } catch (\Exception $e) { + } catch (Exception $e) { throw $e; } } @@ -378,7 +396,7 @@ class Validator /** * Validate pager data * - * @param array $arrayData Data + * @param array $arrayData Data * @param array $arrayVariableNameForException Variable name for exception * * @return mixed Returns TRUE when pager data is valid, Message Error otherwise @@ -387,7 +405,7 @@ class Validator { try { foreach ($arrayPagerData as $key => $value) { - $nameForException = (isset($arrayVariableNameForException[$key]))? + $nameForException = (isset($arrayVariableNameForException[$key])) ? $arrayVariableNameForException[$key] : $key; if (!is_null($value) && @@ -403,7 +421,7 @@ class Validator //Return return true; - } catch (\Exception $e) { + } catch (Exception $e) { throw $e; } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index 3b2abc685..dd50d7e30 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -405,6 +405,7 @@ class Variable if (isset($aData["VAR_NAME"])) { Validator::isString($aData['VAR_NAME'], '$var_name'); Validator::isNotEmpty($aData['VAR_NAME'], '$var_name'); + Validator::isValidVariableName($aData['VAR_NAME']); } if (isset($aData["VAR_FIELD_TYPE"])) { Validator::isString($aData['VAR_FIELD_TYPE'], '$var_field_type'); @@ -462,7 +463,7 @@ class Variable if ($variableName === $row["VAR_NAME"]) { throw new Exception(G::LoadTranslation("DYNAFIELD_ALREADY_EXIST")); } - if (AdditionalTables::getPHPName($variableName) === AdditionalTables::getPHPName($row["VAR_NAME"])) { + if (strtolower(AdditionalTables::getPHPName($variableName)) === strtolower(AdditionalTables::getPHPName($row["VAR_NAME"]))) { throw new Exception(G::LoadTranslation("DYNAFIELD_PHPNAME_ALREADY_EXIST", array($row["VAR_NAME"]))); } } diff --git a/workflow/engine/src/ProcessMaker/Importer/Importer.php b/workflow/engine/src/ProcessMaker/Importer/Importer.php index 47d0acf02..665aa9e02 100644 --- a/workflow/engine/src/ProcessMaker/Importer/Importer.php +++ b/workflow/engine/src/ProcessMaker/Importer/Importer.php @@ -195,7 +195,7 @@ abstract class Importer } catch (\Exception $e) { throw $e; } - $this->removeProject(); + $this->removeProject(true); /*----------------------------------********---------------------------------*/ } else { $granularObj = new \ProcessMaker\BusinessModel\Migrator\GranularImporter(); @@ -300,8 +300,6 @@ abstract class Importer $this->preserveEmailEventConfiguration($emailEvent); } } - - $this->preserveCurrentId($this->importData["tables"]["workflow"]); $objectList = $granularObj->loadObjectsListSelected($this->importData, $newObjectArray); if (sizeof($objectList) > 0 && $processGranulate) { @@ -604,8 +602,6 @@ abstract class Importer foreach ($arrayWorkflowTables["emailEvent"] as &$emailEvent) { $this->preserveEmailEventConfiguration($emailEvent); } - - $this->preserveCurrentId($arrayWorkflowTables); $this->importWfTables($arrayWorkflowTables); @@ -952,70 +948,4 @@ abstract class Importer } } - /** - * Restore id values for the dynaforms, input documents and output documents. - * - * @param type $arrayWorkflowTables - */ - private function preserveCurrentId(&$arrayWorkflowTables) - { - $currentProcess = $this->getCurrentProcess(); - - //dynaforms - foreach ($arrayWorkflowTables["dynaforms"] as &$data) { - if (!is_object($currentProcess)) { - unset($data['DYN_ID']); - continue; - } - $currentElements = $currentProcess->dynaforms; - if (!is_array($currentElements)) { - unset($data['DYN_ID']); - continue; - } - foreach ($currentElements as $currentElement) { - if ($currentElement["PRO_UID"] === $data["PRO_UID"] && - $currentElement["DYN_UID"] === $data["DYN_UID"]) { - $data['DYN_ID'] = $currentElement["DYN_ID"]; - } - } - } - - //input documents - foreach ($arrayWorkflowTables["inputs"] as &$data) { - if (!is_object($currentProcess)) { - unset($data['INP_DOC_ID']); - continue; - } - $currentElements = $currentProcess->inputs; - if (!is_array($currentElements)) { - unset($data['INP_DOC_ID']); - continue; - } - foreach ($currentElements as $currentElement) { - if ($currentElement["PRO_UID"] === $data["PRO_UID"] && - $currentElement["INP_DOC_UID"] === $data["INP_DOC_UID"]) { - $data['INP_DOC_ID'] = $currentElement['INP_DOC_ID']; - } - } - } - - //output documents - foreach ($arrayWorkflowTables["outputs"] as &$data) { - if (!is_object($currentProcess)) { - unset($data['OUT_DOC_ID']); - continue; - } - $currentElements = $currentProcess->outputs; - if (!is_array($currentElements)) { - unset($data['OUT_DOC_ID']); - continue; - } - foreach ($currentElements as $currentElement) { - if ($currentElement["PRO_UID"] === $data["PRO_UID"] && - $currentElement["OUT_DOC_UID"] === $data["OUT_DOC_UID"]) { - $data['OUT_DOC_ID'] = $currentElement['OUT_DOC_ID']; - } - } - } - } } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases/InputDocument.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases/InputDocument.php index 2aa069f7e..afcec50ae 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases/InputDocument.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases/InputDocument.php @@ -1,10 +1,11 @@ getUserId(); - $inputDocument = new \ProcessMaker\BusinessModel\Cases\InputDocument(); + //We will to get list of documents that the user can be access + $bmCases = new BussinessModelCases(); + $arrayApplicationData = $bmCases->getApplicationRecordByPk($app_uid, [], false); + $userAuthorization = $bmCases->userAuthorization( + $userUid, + $arrayApplicationData['PRO_UID'], + $app_uid, + [], + ['INPUT_DOCUMENTS' => 'VIEW', 'ATTACHMENTS' => 'VIEW'], + true + ); + $documentsCanAccess = array_merge( + $userAuthorization['objectPermissions']['INPUT_DOCUMENTS'], + $userAuthorization['objectPermissions']['ATTACHMENTS'] + ); - $response = $inputDocument->getCasesInputDocuments($app_uid, $userUid); + //We will to get documents information that the user uploaded and/or that the user has permission + $inputDocument = new CasesInputDocument(); + //@todo we need to review the function getCasesInputDocuments with the ticket HOR-4755 + $response = $inputDocument->getCasesInputDocuments($app_uid, $userUid, $documentsCanAccess); - if (empty($response)) { + //If the user is a supervisor we will to get the documents can be access + if (empty($response) && $userAuthorization['supervisor']) { $response = $inputDocument->getCasesInputDocumentsBySupervisor($app_uid, $userUid); } //Return return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Light.php b/workflow/engine/src/ProcessMaker/Services/Api/Light.php index 914c9dc0b..11f126b25 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Light.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Light.php @@ -2,28 +2,31 @@ namespace ProcessMaker\Services\Api; +use AppDelegation; use Bootstrap; +use Cases as ClassesCases; +use Criteria; +use Exception; use G; +use Luracast\Restler\RestException; +use PmDynaform; +use Process as ModelProcess; +use ProcessMaker\BusinessModel\Cases as BusinessModelCases; +use ProcessMaker\BusinessModel\DynaForm as BusinessModelDynaForm; +use ProcessMaker\BusinessModel\Light as BusinessModelLight; +use ProcessMaker\BusinessModel\Lists; +use ProcessMaker\BusinessModel\Process; +use ProcessMaker\BusinessModel\ProcessMap; +use ProcessMaker\BusinessModel\Task; +use ProcessMaker\BusinessModel\Validator; use ProcessMaker\Project\Adapter; use ProcessMaker\Services\Api; -use Luracast\Restler\RestException; -use ProcessMaker\BusinessModel\Validator; +use ProcessMaker\Services\Api\Project\Activity\Step; use ProcessMaker\Util\DateTime; -use PmDynaform; -use Exception; -use ProcessMaker\BusinessModel\Light as BusinessModelLight; use RBAC; -use ProcessMaker\BusinessModel\Cases as BusinessModelCases; -use Cases as ClassesCases; -use AppDelegation; -use ProcessMaker\BusinessModel\Lists; -use ProcessMaker\BusinessModel\Task; -use ProcessMaker\BusinessModel\ProcessMap; -use ProcessMaker\BusinessModel\Process; -use Criteria; -use StepPeer; use stdclass; -use ProcessMaker\BusinessModel\DynaForm as BusinessModelDynaForm; +use StepPeer; + /** * * Process Api Controller @@ -921,41 +924,57 @@ class Light extends Api } /** + * Get steps related to the task + * If the process is classic we does not return any step, this is not supported by Mobile + * * @url GET /project/:prj_uid/activity/:act_uid/steps * * @param string $act_uid {@min 32}{@max 32} * @param string $prj_uid {@min 32}{@max 32} + * + * @return array + * @throws Exception */ public function doGetActivitySteps($act_uid, $prj_uid) { try { - $task = new Task(); - $task->setFormatFieldNameInUppercase(false); - $task->setArrayParamException(array("taskUid" => "act_uid", "stepUid" => "step_uid")); + $response = []; + $process = new ModelProcess(); + $isBpmn = $process->isBpmnProcess($prj_uid); + if ($isBpmn) { + $task = new Task(); + $dynaForm = new BusinessModelDynaForm(); + $mobile = new BusinessModelLight(); + $step = new Step(); - $activitySteps = $task->getSteps($act_uid); - $_SESSION['PROCESS'] = $prj_uid; - $dynaForm = new BusinessModelDynaForm(); - $dynaForm->setFormatFieldNameInUppercase(false); - $oMobile = new BusinessModelLight(); - $step = new \ProcessMaker\Services\Api\Project\Activity\Step(); - $response = array(); - for ($i = 0; $i < count($activitySteps); $i++) { - if ($activitySteps[$i]['step_type_obj'] == "DYNAFORM") { - $dataForm = $dynaForm->getDynaForm($activitySteps[$i]['step_uid_obj']); - $result = $this->parserDataDynaForm($dataForm); - $result["formUpdateDate"] = DateTime::convertUtcToIso8601($result["formUpdateDate"]); - $result['index'] = $i; - $result['stepId'] = $activitySteps[$i]["step_uid"]; - $result['stepUidObj'] = $activitySteps[$i]["step_uid_obj"]; - $result['stepMode'] = $activitySteps[$i]['step_mode']; - $result['stepCondition'] = $activitySteps[$i]['step_condition']; - $result['stepPosition'] = $activitySteps[$i]['step_position']; - $trigger = $oMobile->statusTriggers($step->doGetActivityStepTriggers($activitySteps[$i]["step_uid"], - $act_uid, $prj_uid)); - $result["triggers"] = $trigger; - unset($result["formContent"]); - $response[] = $result; + $task->setFormatFieldNameInUppercase(false); + $task->setArrayParamException(["taskUid" => "act_uid", "stepUid" => "step_uid"]); + $activitySteps = $task->getSteps($act_uid); + $_SESSION['PROCESS'] = $prj_uid; + $dynaForm->setFormatFieldNameInUppercase(false); + + for ($i = 0; $i < count($activitySteps); $i++) { + if ($activitySteps[$i]['step_type_obj'] == "DYNAFORM") { + $dataForm = $dynaForm->getDynaForm($activitySteps[$i]['step_uid_obj']); + $result = $this->parserDataDynaForm($dataForm); + $result["formUpdateDate"] = DateTime::convertUtcToIso8601($result["formUpdateDate"]); + $result['index'] = $i; + $result['stepId'] = $activitySteps[$i]["step_uid"]; + $result['stepUidObj'] = $activitySteps[$i]["step_uid_obj"]; + $result['stepMode'] = $activitySteps[$i]['step_mode']; + $result['stepCondition'] = $activitySteps[$i]['step_condition']; + $result['stepPosition'] = $activitySteps[$i]['step_position']; + $trigger = $mobile->statusTriggers( + $step->doGetActivityStepTriggers( + $activitySteps[$i]["step_uid"], + $act_uid, + $prj_uid + ) + ); + $result["triggers"] = $trigger; + unset($result["formContent"]); + $response[] = $result; + } } } } catch (Exception $e) { diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php b/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php index 36698c25a..c378f0c71 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php @@ -1,8 +1,10 @@ updateTable($request_data); - } catch (\Exception $e) { + $pmTable = new BusinessModelTable(); + $response = $pmTable->updateTable($request_data); + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } diff --git a/workflow/engine/templates/pmTables/data.js b/workflow/engine/templates/pmTables/data.js index e117afd78..0cd889d64 100644 --- a/workflow/engine/templates/pmTables/data.js +++ b/workflow/engine/templates/pmTables/data.js @@ -818,18 +818,27 @@ UpdatePageConfig = function(pageSize){ }); }; -genDataReport = function() +/** + * Regenerate data report + * + * @returns void + */ +genDataReport = function () { - Ext.Ajax.request({ - url: '../pmTablesProxy/genDataReport', - params: {id: tableDef.ADD_TAB_UID}, - success: function(resp){ - response = Ext.util.JSON.decode(resp.responseText); - PMExt.notify(_('ID_UPDATE'), response.message) - Ext.getCmp('infoGrid').store.reload(); - }, - failure: function(obj, resp){ - PMExt.error( _('ID_ERROR'), resp.result.message); - } - }); + genDataReportButton.setDisabled(true); + Ext.Ajax.request({ + url: '../pmTablesProxy/genDataReport', + params: {id: tableDef.ADD_TAB_UID}, + success: function (resp) { + genDataReportButton.setDisabled(false); + response = Ext.util.JSON.decode(resp.responseText); + PMExt.notify(_('ID_UPDATE'), response.message) + Ext.getCmp('infoGrid').store.reload(); + + }, + failure: function (obj, resp) { + genDataReportButton.setDisabled(false); + PMExt.error(_('ID_ERROR'), resp.result.message); + } + }); } diff --git a/workflow/engine/templates/pmTables/list.js b/workflow/engine/templates/pmTables/list.js index dc50178b5..8d3027983 100644 --- a/workflow/engine/templates/pmTables/list.js +++ b/workflow/engine/templates/pmTables/list.js @@ -281,7 +281,7 @@ Ext.onReady(function(){ cmodelColumns.push({header: _('ID_NAME'), dataIndex: 'ADD_TAB_NAME', width: 300, align:'left', renderer: function(v,p,r){ return r.get('TYPE') == 'CLASSIC'? v + ' ('+ _('ID_OLD_VERSION') +')' : v; }}); - cmodelColumns.push({header: _('ID_DESCRIPTION'), dataIndex: 'ADD_TAB_DESCRIPTION', sortable:false, width: 400, hidden:false, align:'left', renderer: function(v,p,r){ + cmodelColumns.push({header: _('ID_DESCRIPTION'), dataIndex: 'ADD_TAB_DESCRIPTION', sortable: true, width: 400, hidden: false, align: 'left', renderer: function (v, p, r) { if (r.get('ADD_TAB_TAG')) { tag = r.get('ADD_TAB_TAG').replace('plugin@', ''); tag = tag.charAt(0).toUpperCase() + tag.slice(1); @@ -304,7 +304,9 @@ Ext.onReady(function(){ cmodelColumns.push({dataIndex: "DBS_UID", hidden: true, hideable: false}); - cmodelColumns.push({header: _('ID_RECORDS'), dataIndex: 'NUM_ROWS', width: 90, align:'left'}); + cmodelColumns.push({header: _('ID_RECORDS'), dataIndex: 'NUM_ROWS', width: 90, align:'left', renderer: function (v, p, r) { + return '
' + v + '
'; + }}); if (PRO_UID === false) { cmodelColumns.push({header: _('ID_PROCESS'), dataIndex: 'PRO_TITLE', width: 180, align:'left'});