diff --git a/workflow/engine/bin/tasks/cliWorkspaces.php b/workflow/engine/bin/tasks/cliWorkspaces.php index 8f3a35f91..9f6725af0 100644 --- a/workflow/engine/bin/tasks/cliWorkspaces.php +++ b/workflow/engine/bin/tasks/cliWorkspaces.php @@ -342,6 +342,22 @@ CLI::taskOpt("lang", "", "lLANG", "lang=LANG"); CLI::taskArg('workspace'); CLI::taskRun("cliListIds"); + /** + * + */ +CLI::taskName('regenerate-pmtable-classes'); +CLI::taskDescription(<< Migrating and populating data Singleton took " . ($stop - $start) . " seconds.\n"); } -} \ No newline at end of file +} +/** + * This method recursively finds all PHP files that reference the path PATH_DATA + * incorrectly, which is caused by importing processes where the data directory + * of ProcessMaker has different routes. Modified files are backed up with the + * extension '.backup' in the same directory. + * + * @param array $args + * @param array $opts + * @throws Exception + * @return void + */ +function regenerate_pmtable_classes($args, $opts) +{ + if (sizeof($args) > 0) { + $start = microtime(true); + CLI::logging("> Updating generated class files for PM Tables...\n"); + + Bootstrap::setConstantsRelatedWs($args[0]); + $workspaceTools = new workspaceTools($args[0]); + $workspaceTools->fixReferencePathFiles(PATH_DATA_SITE . "classes", PATH_DATA); + + $stop = microtime(true); + CLI::logging("<*> Updating generated class files for PM Tables took " . ($stop - $start) . " seconds.\n"); + } else { + throw new Exception("No workspace specified for updating generated class files."); + } +} diff --git a/workflow/engine/classes/PmTable.php b/workflow/engine/classes/PmTable.php index cfc5a9522..ac7d60d87 100644 --- a/workflow/engine/classes/PmTable.php +++ b/workflow/engine/classes/PmTable.php @@ -113,6 +113,17 @@ class PmTable } } + /** + * + * + * @param string $adapter + * @return void + */ + public function setDbConfigAdapter($adapter) + { + $this->dbConfig->adapter = $adapter; + } + /** * Backward compatibility function * Resolve a propel data source diff --git a/workflow/engine/classes/class.consolidatedCases.php b/workflow/engine/classes/class.consolidatedCases.php index a77e79e0d..c0c261b4d 100644 --- a/workflow/engine/classes/class.consolidatedCases.php +++ b/workflow/engine/classes/class.consolidatedCases.php @@ -17,7 +17,7 @@ class ConsolidatedCases $RepTabUid = $data['rep_uid']; $TableName = $data['table_name']; $Title = $data['title']; - if($this->isUpdateFields($data) && $Status) { + if ($this->isUpdateFields($data) && $Status) { return true; } if ($this->existTable && $Status) { @@ -26,14 +26,14 @@ class ConsolidatedCases if ($RepTabUid != '') { $this->deleteRepTab($RepTabUid, $Status, $TasUid, $TableName); - if(!$Status){ + if (!$Status) { return true; } $RepTabUid = ''; } $_POST['form']['PRO_UID'] = $ProUid; - $_POST['form']['REP_TAB_UID'] = $RepTabUid; + $_POST['form']['REP_TAB_UID'] = $RepTabUid; $_POST['form']['REP_TAB_NAME'] = $TableName; $_POST['form']['REP_TAB_TYPE'] = "NORMAL"; $_POST['form']['REP_TAB_GRID'] = ''; @@ -43,7 +43,7 @@ class ConsolidatedCases $_POST['form']['REP_TAB_TITLE'] = $Title; $_POST['form']['FIELDS'] = array(); - $sOldTableName = $_POST['form']['REP_TAB_NAME']; + $sOldTableName = $_POST['form']['REP_TAB_NAME']; $sOldConnection = $_POST['form']['REP_TAB_CONNECTION']; $_POST['form']['REP_TAB_UID'] = $this->createReportTable($_POST['form']); @@ -174,7 +174,7 @@ class ConsolidatedCases if ($this->existTableName) { $diff = array_diff($data, $this->rowRepTab); } - if ($this->existCaseConsolidate){ + if ($this->existCaseConsolidate) { $diff = array_diff($diff, $this->rowCaseConsCore); } return count($diff) <= 0; @@ -213,9 +213,40 @@ class ConsolidatedCases return $oReportTable->getRepTabUid(); } - public function createReportVariables($RepTabUid, $ProUid, $formFields) + /** + * Create a record to 'ReportVar', this function uses the fields generated by + * the function 'buildReportVariables'. + * + * @param string $repTabUid + * @param string $proUid + * @param array $formFields + * @return array + */ + public function createReportVariables($repTabUid, $proUid, $formFields) + { + list($fieldsClass, $fields) = $this->buildReportVariables($formFields, function ($repVarName, $repVarType) use ($repTabUid, $proUid) { + $reportVar = new ReportVar(); + $reportVar->create(array( + 'REP_TAB_UID' => $repTabUid, + 'PRO_UID' => $proUid, + 'REP_VAR_NAME' => $repVarName, + 'REP_VAR_TYPE' => $repVarType) + ); + }); + + return array($fieldsClass, $fields); + } + + /** + * Generates the fields for 'Report Tables', the second parameter is a 'callback' + * that receives as arguments the name and type of the field. + * + * @param array $formFields + * @param function $callbackFunction + * @return array + */ + public function buildReportVariables($formFields, $callbackFunction = null) { - $oReportVar = new ReportVar(); $fieldsClass = array(); $fields = array(); $i = 1; @@ -224,7 +255,7 @@ class ConsolidatedCases $fieldsClass[$i]['FLD_KEY'] = 'on'; $fieldsClass[$i]['FLD_AUTO_INCREMENT'] = 'off'; $fieldsClass[$i]['FLD_DESCRIPTION'] = ''; - $fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR' ; + $fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR'; $fieldsClass[$i]['FLD_SIZE'] = 32; $i++; $fieldsClass[$i]['FLD_NAME'] = 'APP_NUMBER'; @@ -232,26 +263,26 @@ class ConsolidatedCases $fieldsClass[$i]['FLD_KEY'] = 'on'; $fieldsClass[$i]['FLD_AUTO_INCREMENT'] = 'off'; $fieldsClass[$i]['FLD_DESCRIPTION'] = ''; - $fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR' ; + $fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR'; $fieldsClass[$i]['FLD_SIZE'] = 255; - foreach ($formFields as $sField) { - $aField = explode('-', $sField); - if ($aField[1] == 'title' || $aField[1] == 'submit') { + foreach ($formFields as $field) { + $fieldProperty = explode('-', $field); + if ($fieldProperty[1] == 'title' || $fieldProperty[1] == 'submit') { continue; } $i++; - $fieldsClass[$i]['FLD_NAME'] = $aField[0]; + $fieldsClass[$i]['FLD_NAME'] = $fieldProperty[0]; $fieldsClass[$i]['FLD_NULL'] = 'off'; $fieldsClass[$i]['FLD_KEY'] = 'off'; $fieldsClass[$i]['FLD_AUTO_INCREMENT'] = 'off'; $fieldsClass[$i]['FLD_DESCRIPTION'] = ''; - switch ($aField[1]) { + switch ($fieldProperty[1]) { case 'currency': case 'percentage': - $sType = 'number'; - $fieldsClass[$i]['FLD_TYPE'] = 'FLOAT' ; + $type = 'number'; + $fieldsClass[$i]['FLD_TYPE'] = 'FLOAT'; $fieldsClass[$i]['FLD_SIZE'] = 255; break; case 'text': @@ -262,34 +293,32 @@ class ConsolidatedCases case 'radiogroup': case 'hidden': case "link": - $sType = 'char'; - $fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR' ; + $type = 'char'; + $fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR'; $fieldsClass[$i]['FLD_SIZE'] = 255; break; case 'textarea': - $sType = 'text'; - $fieldsClass[$i]['FLD_TYPE'] = 'TEXT' ; + $type = 'text'; + $fieldsClass[$i]['FLD_TYPE'] = 'TEXT'; $fieldsClass[$i]['FLD_SIZE'] = ''; break; case 'date': - $sType = 'date'; - $fieldsClass[$i]['FLD_TYPE'] = 'DATE' ; + $type = 'date'; + $fieldsClass[$i]['FLD_TYPE'] = 'DATE'; $fieldsClass[$i]['FLD_SIZE'] = ''; break; default: - $sType = 'char'; - $fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR' ; + $type = 'char'; + $fieldsClass[$i]['FLD_TYPE'] = 'VARCHAR'; $fieldsClass[$i]['FLD_SIZE'] = 255; break; } - $oReportVar->create(array( - 'REP_TAB_UID' => $RepTabUid, - 'PRO_UID' => $ProUid, - 'REP_VAR_NAME' => $aField[0], - 'REP_VAR_TYPE' => $sType) - ); - $fields[] = array('sFieldName' => $aField[0], 'sType' => $sType); + if (!empty($callbackFunction) && is_callable($callbackFunction)) { + $callbackFunction($fieldProperty[0], $type); + } + + $fields[] = array('sFieldName' => $fieldProperty[0], 'sType' => $type); } return array($fieldsClass, $fields); } diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index 2a80c6ab7..94bdda23d 100644 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -1,15 +1,12 @@ fillAppCacheView($lang); } //set status in config table - $confParams = Array('LANG' => $lang, 'STATUS' => 'active'); + $confParams = array('LANG' => $lang, 'STATUS' => 'active'); $oConf->aConfig = $confParams; $oConf->saveConfig('APP_CACHE_VIEW_ENGINE', '', '', ''); @@ -868,7 +865,7 @@ class workspaceTools p11835::isApplicable(); $systemSchema = PmSystem::getSystemSchema($this->dbAdapter); $systemSchemaRbac = PmSystem::getSystemSchemaRbac($this->dbAdapter);// get the Rbac Schema - $this->registerSystemTables(array_merge($systemSchema,$systemSchemaRbac)); + $this->registerSystemTables(array_merge($systemSchema, $systemSchemaRbac)); $this->upgradeSchema($systemSchema); $this->upgradeSchema($systemSchemaRbac, false, true, $onedb); // perform Upgrade to Rbac $this->upgradeData(); @@ -989,7 +986,7 @@ class workspaceTools $oDataBase = $this->getDatabase($rbac); if (!$onedb) { - if($rbac){ + if ($rbac) { $rename = PmSystem::verifyRbacSchema($workspaceSchema); if (count($rename) > 0) { foreach ($rename as $tableName) { @@ -1142,7 +1139,6 @@ class workspaceTools $Fields['WORKSPACE_NAME'] = $this->name; if (isset($this->dbHost)) { - $dbNetView = new NET($this->dbHost); $dbNetView->loginDbServer($this->dbUser, $this->dbPass); try { @@ -1211,7 +1207,7 @@ class workspaceTools if ($fields['DB_NAME'] == $fields['DB_RBAC_NAME']) { $info = array('Workspace Name' => $fields['WORKSPACE_NAME'], 'Workflow Database' => sprintf("%s://%s:%s@%s/%s", $fields['DB_ADAPTER'], $fields['DB_USER'], $fields['DB_PASS'], $fields['DB_HOST'], $fields['DB_NAME']), 'MySql Version' => $fields['DATABASE']); } else { - $info = array('Workspace Name' => $fields['WORKSPACE_NAME'], + $info = array('Workspace Name' => $fields['WORKSPACE_NAME'], //'Available Databases' => $fields['AVAILABLE_DB'], 'Workflow Database' => sprintf("%s://%s:%s@%s/%s", $fields['DB_ADAPTER'], $fields['DB_USER'], $fields['DB_PASS'], $fields['DB_HOST'], $fields['DB_NAME']), 'RBAC Database' => sprintf("%s://%s:%s@%s/%s", $fields['DB_ADAPTER'], $fields['DB_RBAC_USER'], $fields['DB_RBAC_PASS'], $fields['DB_RBAC_HOST'], $fields['DB_RBAC_NAME']), 'Report Database' => sprintf("%s://%s:%s@%s/%s", $fields['DB_ADAPTER'], $fields['DB_REPORT_USER'], $fields['DB_REPORT_PASS'], $fields['DB_REPORT_HOST'], $fields['DB_REPORT_NAME']), 'MySql Version' => $fields['DATABASE'] ); @@ -1253,7 +1249,7 @@ class workspaceTools if ($onedb) { $databases = array("rb", "rp"); - } else if ($dbInfo['DB_NAME'] == $dbInfo['DB_RBAC_NAME']) { + } elseif ($dbInfo['DB_NAME'] == $dbInfo['DB_RBAC_NAME']) { $databases = array("wf"); } else { $databases = array("wf", "rp", "rb"); @@ -1296,9 +1292,8 @@ class workspaceTools * @param string $filename the backup filename * @param bool $compress wheter to compress or not */ - static public function createBackup($filename, $compress = true) + public static function createBackup($filename, $compress = true) { - if (!file_exists(dirname($filename))) { mkdir(dirname($filename)); } @@ -1389,7 +1384,7 @@ class workspaceTools } $users = mysql_num_rows($result); if ($users === 0) { - CLI::logging("Creating user $username for $hostname\n"); + CLI::logging("Creating user $username for $hostname\n"); $result = mysql_query("CREATE USER '$username'@'$hostname' IDENTIFIED BY '$password'"); if ($result === false) { throw new Exception("Unable to create user $username: " . mysql_error()); @@ -1442,10 +1437,10 @@ class workspaceTools if (!$flag && !is_null($flagFunction)) { //Replace TYPE by ENGINE - if( $versionBackupEngine == 1) { + if ($versionBackupEngine == 1) { $script = preg_replace($arrayRegExpEngineSearch, $arrayRegExpEngineReplace, file_get_contents($filename)); file_put_contents($filename, $script."\nCOMMIT;"); - }else{ + } else { $arrayRegExpEngineSearch = array("/\)\s*TYPE\s*=\s*(InnoDB)/i", "/\)\s*TYPE\s*=\s*(MyISAM)/i"); $arrayRegExpEngineReplace = array(") ENGINE=\\1 DEFAULT CHARSET=utf8", ") ENGINE=\\1"); $script = preg_replace($arrayRegExpEngineSearch, $arrayRegExpEngineReplace, file_get_contents($filename)); @@ -1481,7 +1476,7 @@ class workspaceTools //Replace TYPE by ENGINE $script = preg_replace($arrayRegExpEngineSearch, $arrayRegExpEngineReplace, file_get_contents($filename)); - if( $versionBackupEngine == 1) { + if ($versionBackupEngine == 1) { $script = $script."\nCOMMIT;"; } @@ -1546,14 +1541,13 @@ class workspaceTools return true; } - static public function restoreLegacy($directory) + public static function restoreLegacy($directory) { throw new Exception("Use gulliver to restore backups from old versions"); } - static public function getBackupInfo($filename) + public static function getBackupInfo($filename) { - $backup = new Archive_Tar($filename); //Get a temporary directory in the upgrade directory $tempDirectory = PATH_DATA . "upgrade/" . basename(tempnam(__FILE__, '')); @@ -1581,7 +1575,7 @@ class workspaceTools G::rm_dir($tempDirectory); } - static public function dirPerms($filename, $owner, $group, $perms) + public static function dirPerms($filename, $owner, $group, $perms) { $chown = @chown($filename, $owner); $chgrp = @chgrp($filename, $group); @@ -1617,9 +1611,8 @@ class workspaceTools * @param string $lang for define the language * @param string $port of database if is empty take 3306 */ - static public function restore($filename, $srcWorkspace, $dstWorkspace = null, $overwrite = true, $lang = 'en', $port = '') + public static function restore($filename, $srcWorkspace, $dstWorkspace = null, $overwrite = true, $lang = 'en', $port = '') { - $backup = new Archive_Tar($filename); //Get a temporary directory in the upgrade directory $tempDirectory = PATH_DATA . "upgrade/" . basename(tempnam(__FILE__, '')); @@ -1731,7 +1724,7 @@ class workspaceTools } else { CLI::logging(CLI::error("Could not get the shared folder permissions, not changing workspace permissions") . "\n"); } - list ($dbHost, $dbUser, $dbPass) = @explode(SYSTEM_HASH, G::decrypt(HASH_INSTALLATION, SYSTEM_HASH)); + list($dbHost, $dbUser, $dbPass) = @explode(SYSTEM_HASH, G::decrypt(HASH_INSTALLATION, SYSTEM_HASH)); if ($port != '') { $dbHost = $dbHost . $port; //127.0.0.1:3306 } @@ -1764,7 +1757,7 @@ class workspaceTools foreach ($metadata->databases as $db) { if ($dbName != $newDBNames[$db->name]) { $dbName = $dbUser = $newDBNames[$db->name]; - if(isset($newDBNames['DB_USER'])){ + if (isset($newDBNames['DB_USER'])) { $dbUser = $newDBNames['DB_USER']; } if (mysql_select_db($dbName, $link)) { @@ -1854,6 +1847,12 @@ class workspaceTools $stop = microtime(true); CLI::logging("<*> Migrating an populating indexing for APP_CACHE_VIEW process took " . ($stop - $start) . " seconds.\n"); + $start = microtime(true); + CLI::logging("> Updating generated class files for PM Tables...\n"); + self::fixReferencePathFiles(PATH_DATA_SITE . "classes", PATH_DATA); + $stop = microtime(true); + CLI::logging("<*> Updating generated class files for PM Tables took " . ($stop - $start) . " seconds.\n"); + mysql_close($link); } @@ -1928,7 +1927,8 @@ class workspaceTools } } - public function checkMafeRequirements ($workspace,$lang) { + public function checkMafeRequirements($workspace, $lang) + { $this->initPropel(true); $pmRestClient = OauthClientsPeer::retrieveByPK('x-pm-local-client'); if (empty($pmRestClient)) { @@ -1945,7 +1945,7 @@ class workspaceTools $envFile = PATH_CONFIG . 'env.ini'; $skin ='neoclassic'; - if (file_exists($envFile) ) { + if (file_exists($envFile)) { $sysConf = PmSystem::getSystemConfiguration($envFile); $lang = $sysConf['default_lang']; $skin = $sysConf['default_skin']; @@ -1973,9 +1973,9 @@ class workspaceTools } } - public function changeHashPassword ($workspace, $response) + public function changeHashPassword($workspace, $response) { - $this->initPropel( true ); + $this->initPropel(true); $licensedFeatures = & PMLicensedFeatures::getSingleton(); /*----------------------------------********---------------------------------*/ if ($licensedFeatures->verifyfeature('95OY24wcXpEMzIyRmlNSnF0STNFSHJzMG9wYTJKekpLNmY2ZmRCeGtuZk5oUDloaUNhUGVjTDJBPT0=')) { @@ -1987,9 +1987,9 @@ class workspaceTools return true; } - public function verifyFilesOldEnterprise ($workspace) + public function verifyFilesOldEnterprise($workspace) { - $this->initPropel( true ); + $this->initPropel(true); $pathBackup = PATH_DATA . 'backups'; if (!file_exists($pathBackup)) { G::mk_dir($pathBackup, 0777); @@ -2034,7 +2034,7 @@ class workspaceTools CLI::logging(CLI::error("Could not get shared folder permissions, workspace permissions couldn't be changed") . "\n"); } CLI::logging(" Removing $pathFileEnterprise...\n"); - copy($pathFileEnterprise , $pathNewFile. PATH_SEP . 'enterprise.php'); + copy($pathFileEnterprise, $pathNewFile. PATH_SEP . 'enterprise.php'); G::rm_dir($pathFileEnterprise); if (file_exists($pathFileEnterprise)) { CLI::logging(CLI::info(" Remove manually $pathFileEnterprise...\n")); @@ -2227,7 +2227,8 @@ class workspaceTools CLI::logging("> Completed table LIST_CANCELED\n"); } - public function regenerateListCompleted($lang = 'en'){ + public function regenerateListCompleted($lang = 'en') + { $this->initPropel(true); $query = 'INSERT INTO '.$this->dbName.'.LIST_COMPLETED (APP_UID, @@ -2289,7 +2290,8 @@ class workspaceTools CLI::logging("> Completed table LIST_COMPLETED\n"); } - public function regenerateListMyInbox(){ + public function regenerateListMyInbox() + { $this->initPropel(true); $query = 'INSERT INTO '.$this->dbName.'.LIST_MY_INBOX (APP_UID, @@ -2358,7 +2360,8 @@ class workspaceTools CLI::logging("> Completed table LIST_MY_INBOX\n"); } - public function regenerateListInbox(){ + public function regenerateListInbox() + { $this->initPropel(true); $query = 'INSERT INTO '.$this->dbName.'.LIST_INBOX (APP_UID, @@ -2415,7 +2418,8 @@ class workspaceTools CLI::logging("> Completed table LIST_INBOX\n"); } - public function regenerateListParticipatedHistory(){ + public function regenerateListParticipatedHistory() + { $this->initPropel(true); $query = 'INSERT INTO '.$this->dbName.'.LIST_PARTICIPATED_HISTORY (APP_UID, @@ -2589,7 +2593,8 @@ class workspaceTools * For the labels we use the tables user, process, task and application * @return void */ - public function regenerateListPaused(){ + public function regenerateListPaused() + { $this->initPropel(true); $query = 'INSERT INTO '.$this->dbName.'.LIST_PAUSED ( @@ -2672,7 +2677,8 @@ class workspaceTools } /*----------------------------------********---------------------------------*/ - public function regenerateListUnassigned(){ + public function regenerateListUnassigned() + { $this->initPropel(true); $truncate = 'TRUNCATE '.$this->dbName.'.LIST_UNASSIGNED'; //This executeQuery is very fast than Propel @@ -2731,12 +2737,13 @@ class workspaceTools * * return boolean value */ - public function listFirstExecution ($action, $list='all'){ + public function listFirstExecution($action, $list='all') + { $this->initPropel(true); switch ($action) { case 'insert': $conf = new Configuration(); - if($list==='all'){ + if ($list==='all') { if (!($conf->exists('MIGRATED_LIST', 'list', 'list', 'list', 'list'))) { $data["CFG_UID"] ='MIGRATED_LIST'; $data["OBJ_UID"] ='list'; @@ -2747,7 +2754,7 @@ class workspaceTools $conf->create($data); } } - if($list==='unassigned'){ + if ($list==='unassigned') { if (!($conf->exists('MIGRATED_LIST_UNASSIGNED', 'list', 'list', 'list', 'list'))) { $data["CFG_UID"] ='MIGRATED_LIST_UNASSIGNED'; $data["OBJ_UID"] ='list'; @@ -2763,19 +2770,19 @@ class workspaceTools case 'check': $criteria = new Criteria("workflow"); $criteria->addSelectColumn(ConfigurationPeer::CFG_UID); - if($list==='all'){ + if ($list==='all') { $criteria->add(ConfigurationPeer::CFG_UID, "MIGRATED_LIST", CRITERIA::EQUAL); } - if($list==='unassigned'){ + if ($list==='unassigned') { $criteria->add(ConfigurationPeer::CFG_UID, "MIGRATED_LIST_UNASSIGNED", CRITERIA::EQUAL); } $rsCriteria = AppCacheViewPeer::doSelectRS($criteria); $rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $aRows = array (); + $aRows = array(); while ($rsCriteria->next()) { $aRows[] = $rsCriteria->getRow(); } - if(empty($aRows)){ + if (empty($aRows)) { return false; //If is false continue with the migrated } else { return true; //Stop @@ -2840,7 +2847,8 @@ class workspaceTools * * return void */ - public static function registerSystemTables($aSquema){ + public static function registerSystemTables($aSquema) + { //Register all tables $sListTables = ''; foreach ($aSquema as $key => $value) { @@ -2848,16 +2856,17 @@ class workspaceTools } $sysTablesIniFile= PATH_CONFIG . 'system-tables.ini'; - $contents = file_put_contents( $sysTablesIniFile, sprintf( "%s '%s'\n", "tables = ", $sListTables ) ); + $contents = file_put_contents($sysTablesIniFile, sprintf("%s '%s'\n", "tables = ", $sListTables)); if ($contents === null) { - throw (new Exception( G::LoadTranslation('ID_FILE_NOT_WRITEABLE', SYS_LANG, array($sysTablesIniFile) ) )); + throw (new Exception(G::LoadTranslation('ID_FILE_NOT_WRITEABLE', SYS_LANG, array($sysTablesIniFile)))); } } /** *return void */ - public function checkRbacPermissions(){ + public function checkRbacPermissions() + { CLI::logging("-> Verifying roles permissions in RBAC \n"); //Update table RBAC permissions $RBAC = &RBAC::getSingleton(); @@ -3129,7 +3138,6 @@ class workspaceTools PATH_DATA."/post-missing-inbox-".$this->name.".txt", "[".$item['APP_UID']."] has not been found" ); - } CLI::logging("> Number of missing inbox cases for workspace " . CLI::info($this->name) . ": " . CLI::info($counter) . "\n"); @@ -3276,7 +3284,7 @@ class workspaceTools public function verifyListData($type) { - switch($type) { + switch ($type) { case 'LIST_CANCELLED': $response = $this->verifyMissingCancelled(); break; @@ -3325,7 +3333,7 @@ class workspaceTools $this->initPropel(true); $conf = new Configuration(); $blackList = array(); - if($bExist = $conf->exists('MIGRATED_CONTENT', 'content')){ + if ($bExist = $conf->exists('MIGRATED_CONTENT', 'content')) { $oConfig = $conf->load('MIGRATED_CONTENT', 'content'); $blackList = $oConfig['CFG_VALUE'] == 'true' ? array('Groupwf', 'Process', 'Department', 'Task', 'InputDocument', 'Application') : unserialize($oConfig['CFG_VALUE']); } @@ -3374,14 +3382,14 @@ class workspaceTools $oTable = new $className(); $that = array($oTable, $methods['exists']); $params = array($row[$fieldUidName]); - if (isset($row['CON_PARENT']) && $row['CON_PARENT'] != ''){ + if (isset($row['CON_PARENT']) && $row['CON_PARENT'] != '') { array_push($params, $row['CON_PARENT']); $fieldName = isset($fields['alias']) && isset($fields['alias']['CON_PARENT']) ? $fields['alias']['CON_PARENT'] : 'CON_PARENT'; $row[$fieldName] = $row['CON_PARENT']; } unset($row['CON_PARENT']); - if (call_user_func_array($that, $params)){ - if (isset($methods['update'])){ + if (call_user_func_array($that, $params)) { + if (isset($methods['update'])) { $fn = $methods['update']; $fn($row); } else { @@ -3508,7 +3516,8 @@ class workspaceTools CLI::logging("|--> Clean data in table " . OauthRefreshTokensPeer::TABLE_NAME . " rows ".$refreshToken."\n"); } - public function migrateIteeToDummytask($workspaceName){ + public function migrateIteeToDummytask($workspaceName) + { $this->initPropel(true); $arraySystemConfiguration = PmSystem::getSystemConfiguration('', '', $workspaceName); $conf = new Configurations(); @@ -3531,8 +3540,8 @@ class workspaceTools //Search All process $oCriteria = new Criteria("workflow"); - $oCriteria->addSelectColumn( ProcessPeer::PRO_UID ); - $oCriteria->addSelectColumn( ProcessPeer::PRO_ITEE ); + $oCriteria->addSelectColumn(ProcessPeer::PRO_UID); + $oCriteria->addSelectColumn(ProcessPeer::PRO_ITEE); $oCriteria->add(ProcessPeer::PRO_ITEE, '0', Criteria::EQUAL); $rsCriteria = ProcessPeer::doSelectRS($oCriteria); $rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC); @@ -3542,7 +3551,7 @@ class workspaceTools $row = $rsCriteria->getRow(); $prj_uid = $row['PRO_UID']; $bpmnProcess = new Process(); - if($bpmnProcess->isBpmnProcess($prj_uid)){ + if ($bpmnProcess->isBpmnProcess($prj_uid)) { $project = new \ProcessMaker\Project\Adapter\BpmnWorkflow(); $diagram = $project->getStruct($prj_uid); $res = $project->updateFromStruct($prj_uid, $diagram); @@ -3568,9 +3577,10 @@ class workspaceTools $conf->saveConfig('SKIN_CRON', ''); } - public function upgradeAuditLog($workspace){ + public function upgradeAuditLog($workspace) + { $conf = new Configurations(); - if (!$conf->exists('AUDIT_LOG','log')) { + if (!$conf->exists('AUDIT_LOG', 'log')) { CLI::logging("> Updating Auditlog Config \n"); $oServerConf = &serverConf::getSingleton(); $sAudit = $oServerConf->getAuditLogProperty('AL_OPTION', $workspace); @@ -3579,7 +3589,8 @@ class workspaceTools } } - public function migrateSelfServiceRecordsRun($workspace) { + public function migrateSelfServiceRecordsRun($workspace) + { // Initializing $this->initPropel(true); @@ -3597,7 +3608,7 @@ class workspaceTools $row = $rsCriteria->getRow(); $temp = @unserialize($row['GRP_UID']); if (is_array($temp)) { - foreach($temp as $groupUid) { + foreach ($temp as $groupUid) { if ($groupUid != '') { $appAssignSelfServiceValueGroup = new AppAssignSelfServiceValueGroup(); $appAssignSelfServiceValueGroup->setId($row['ID']); @@ -3625,7 +3636,8 @@ class workspaceTools CLI::logging(" Migrating Self-Service by Value Cases Done \n"); } - public function migratePopulateIndexingACV($workspace) { + public function migratePopulateIndexingACV($workspace) + { // Migrating and populating new indexes CLI::logging("-> Migrating an populating indexing for avoiding the use of table APP_CACHE_VIEW Start \n"); @@ -3752,7 +3764,7 @@ class workspaceTools CLI::logging("-> Populating PRO_ID, USR_ID at LIST_* \n"); $con->begin(); $stmt = $con->createStatement(); - foreach(workspaceTools::$populateIdsQueries as $query) { + foreach (workspaceTools::$populateIdsQueries as $query) { $stmt->executeQuery($query); } $con->commit(); @@ -3761,14 +3773,14 @@ class workspaceTools } /** - * It populates the WEB_ENTRY table for the classic processes, this procedure - * is done to verify the execution of php files generated when the WebEntry + * It populates the WEB_ENTRY table for the classic processes, this procedure + * is done to verify the execution of php files generated when the WebEntry * is configured. * @param type $workSpace */ public function updatingWebEntryClassicModel($workSpace, $force = false) { - //We obtain from the configuration the list of proUids obtained so that + //We obtain from the configuration the list of proUids obtained so that //we do not go through again. $cfgUid = 'UPDATING_ROWS_WEB_ENTRY'; $objUid = 'blackList'; @@ -3780,7 +3792,7 @@ class workspaceTools $blackList = unserialize($oConfig['CFG_VALUE']); } - //The following query returns all the classic processes that do not have + //The following query returns all the classic processes that do not have //a record in the WEB_ENTRY table. $oCriteria = new Criteria("workflow"); $oCriteria->addSelectColumn(ProcessPeer::PRO_UID); @@ -3821,7 +3833,7 @@ class workspaceTools $row1 = $stepRs->getRow(); $content = file_get_contents($path . "/" . $fileName); if (strpos($content, $proUid . "/" . $row1["STEP_UID_OBJ"]) !== false) { - //The default user admin is set. This task is + //The default user admin is set. This task is //carried out by the system administrator. $userUid = "00000000000000000000000000000001"; //save data in table WEB_ENTRY @@ -3843,7 +3855,7 @@ class workspaceTools } } - //The list of proUids obtained is saved in the configuration so that it + //The list of proUids obtained is saved in the configuration so that it //does not go through again. $data = [ "CFG_UID" => $cfgUid, @@ -3895,4 +3907,24 @@ class workspaceTools $conf->create($data); } } + + /** + * This method finds all recursively PHP files that have the path PATH_DATA, + * poorly referenced, this is caused by the import of processes where the data + * directory of ProcessMaker has different routes. Modified files are backed + * up with the extension '.backup' in the same directory. + * + * @return void + */ + public function fixReferencePathFiles($pathClasses, $pathData) + { + try { + $this->initPropel(true); + $fixReferencePath = new FixReferencePath(); + $fixReferencePath->runProcess($pathClasses, $pathData); + CLI::logging($fixReferencePath->getResumeDebug()); + } catch (Exception $e) { + CLI::logging(CLI::error("Error:" . "Error updating generated class files for PM Tables, proceed to regenerate manually: " . $e)); + } + } } diff --git a/workflow/engine/src/ProcessMaker/Util/FixReferencePath.php b/workflow/engine/src/ProcessMaker/Util/FixReferencePath.php new file mode 100644 index 000000000..94a2f8d3a --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Util/FixReferencePath.php @@ -0,0 +1,241 @@ +modeDebug; + } + + /** + * Set property modeDebug. + * + * @param boolean $modeDebug + */ + public function setModeDebug($modeDebug) + { + $this->modeDebug = $modeDebug; + } + + /** + * Get property resumeDebug. + * + * @return string + */ + public function getResumeDebug() + { + return $this->resumeDebug; + } + + /** + * Set property resumeDebug. + * + * @param string $resumeDebug + */ + public function setResumeDebug($resumeDebug) + { + $this->resumeDebug = $resumeDebug; + } + + /** + * Find all PHP type files recursively. + * The '$pathData' argument is the path to be replaced with the path found + * as incorrect. + * + * @param string $directory + * @param string $pathData + * @return void + */ + public function runProcess($directory, $pathData) + { + try { + //This variable is not defined and does not involve its value in this + //task, it is removed at the end of the method. + $_SERVER["REQUEST_URI"] = ""; + if (!defined("SYS_SKIN")) { + $conf = new Configurations(); + define("SYS_SKIN", $conf->getConfiguration('SKIN_CRON', '')); + } + + $criteria = new Criteria("workflow"); + $criteria->addSelectColumn(ReportTablePeer::REP_TAB_UID); + $criteria->addSelectColumn(CaseConsolidatedCorePeer::TAS_UID); + $criteria->addSelectColumn(ReportTablePeer::REP_TAB_NAME); + $criteria->addJoin(ReportTablePeer::REP_TAB_UID, CaseConsolidatedCorePeer::REP_TAB_UID, Criteria::JOIN); + $criteria->add(CaseConsolidatedCorePeer::CON_STATUS, "ACTIVE", Criteria::EQUAL); + $doSelect = ReportTablePeer::doSelectRS($criteria); + $doSelect->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + $consolidatedCases = new ConsolidatedCases(); + while ($doSelect->next()) { + $row = $doSelect->getRow(); + $fields = $this->getReportTableFields($row["REP_TAB_UID"]); + list($fields, $outFields) = $consolidatedCases->buildReportVariables($fields); + try { + $this->regeneratePropelClasses($row["REP_TAB_NAME"], $row["REP_TAB_NAME"], $fields, $row["TAS_UID"]); + $this->outVerboseln("* Regenerate classes for table: " . $row["REP_TAB_NAME"]); + } catch (Exception $e) { + CLI::logging(CLI::error("Error:" . "Error in regenerate classes for table: " . $row["REP_TAB_NAME"] . ". " . $e)); + } + } + + $criteria = new Criteria("workflow"); + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_UID); + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_NAME); + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_CLASS_NAME); + $criteria->addSelectColumn(AdditionalTablesPeer::DBS_UID); + $doSelect = AdditionalTablesPeer::doSelectRS($criteria); + $doSelect->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + while ($doSelect->next()) { + $row = $doSelect->getRow(); + $fields = $this->getAdditionalTablesFields($row["ADD_TAB_UID"]); + try { + $pmTable = new PmTable($row["ADD_TAB_NAME"]); + $pmTable->setDbConfigAdapter("mysql"); + $pmTable->setColumns($fields); + $pmTable->prepare(); + $pmTable->preparePropelIniFile(); + $pmTable->buildSchema(); + $pmTable->phingbuildModel(); + $this->outVerboseln("* Regenerate classes for table: " . $row["ADD_TAB_NAME"]); + } catch (Exception $e) { + CLI::logging(CLI::error("Error:" . "Error in regenerate classes for table: " . $row["ADD_TAB_NAME"] . ". " . $e)); + } + } + + unset($_SERVER["REQUEST_URI"]); + } catch (Exception $e) { + CLI::logging(CLI::error("Error:" . "Error in regenerate classes files, proceed to regenerate manually: " . $e)); + } + } + + /** + * Gets the fields of the 'Report Table'. + * + * @param string $repTabUid + * @return array + */ + public function getReportTableFields($repTabUid) + { + $fields = array(); + $criteria = new Criteria("workflow"); + $criteria->addSelectColumn(ReportVarPeer::REP_VAR_NAME); + $criteria->addSelectColumn(ReportVarPeer::REP_VAR_TYPE); + $criteria->add(ReportVarPeer::REP_TAB_UID, $repTabUid, Criteria::EQUAL); + $doSelect = ReportVarPeer::doSelectRS($criteria); + $doSelect->setFetchmode(ResultSet::FETCHMODE_ASSOC); + while ($doSelect->next()) { + $row = $doSelect->getRow(); + $fields[] = $row['REP_VAR_NAME'] . '-' . $row['REP_VAR_TYPE']; + } + return $fields; + } + + /** + * Gets the fields of the 'Additional Table'. + * + * @param string $addTabUid + * @return object + */ + public function getAdditionalTablesFields($addTabUid) + { + $fields = array(); + $criteria = new Criteria("workflow"); + $criteria->add(FieldsPeer::ADD_TAB_UID, $addTabUid); + $doSelect = FieldsPeer::doSelectRS($criteria); + $doSelect->setFetchmode(ResultSet::FETCHMODE_ASSOC); + while ($doSelect->next()) { + $row = $doSelect->getRow(); + $object = new stdClass(); + $object->field_index = $row["FLD_INDEX"]; + $object->field_name = $row["FLD_NAME"]; + $object->field_description = $row["FLD_DESCRIPTION"]; + $object->field_type = $row["FLD_TYPE"]; + $object->field_size = $row["FLD_SIZE"]; + $object->field_null = $row["FLD_NULL"]; + $object->field_autoincrement = $row["FLD_AUTO_INCREMENT"]; + $object->field_key = $row["FLD_KEY"]; + $fields[] = $object; + } + return $fields; + } + + /** + * Regenerate 'Propel' classes for 'Report Tables'. The name of the 'Report Table', + * the fields and the related task are required. + * + * @param string $repTabName + * @param array $fields + * @param string $guid + * @return void + */ + public function regeneratePropelClasses($repTabName, $className, $fields, $guid) + { + $sourcePath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP; + + @unlink($sourcePath . $className . '.php'); + @unlink($sourcePath . $className . 'Peer.php'); + @unlink($sourcePath . PATH_SEP . 'map' . PATH_SEP . $className . 'MapBuilder.php'); + @unlink($sourcePath . PATH_SEP . 'om' . PATH_SEP . 'Base' . $className . '.php'); + @unlink($sourcePath . PATH_SEP . 'om' . PATH_SEP . 'Base' . $className . 'Peer.php'); + + $additionalTables = new AdditionalTables(); + $additionalTables->createPropelClasses($repTabName, $className, $fields, $guid); + } + + /** + * Display the output found, the message is not displayed if the value of the + * 'modeVerbose' property is false. + * + * @param string $message + * @return void + */ + private function outVerbose($message) + { + $this->resumeDebug = $this->resumeDebug . $message; + if ($this->modeDebug === true) { + echo $message; + } + } + + /** + * Shows on the screen the output found with line break. + * + * @param string $message + * @return void + */ + private function outVerboseln($message) + { + $this->outVerbose($message . "\n"); + } +} +