Merged in bugfix/HOR-3509 (pull request #5816)

HOR-3509

Approved-by: Julio Cesar Laura Avendaño <contact@julio-laura.com>
This commit is contained in:
Roly
2017-08-11 01:25:27 +00:00
committed by Julio Cesar Laura Avendaño
5 changed files with 461 additions and 103 deletions

View File

@@ -329,6 +329,22 @@ CLI::taskOpt("lang", "", "lLANG", "lang=LANG");
CLI::taskArg('workspace');
CLI::taskRun("cliListIds");
/**
*
*/
CLI::taskName('regenerate-pmtable-classes');
CLI::taskDescription(<<<EOT
Regenerate the class with incorrect reference
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.
EOT
);
CLI::taskArg('workspace');
CLI::taskRun("regenerate_pmtable_classes");
/**
* Function run_info
* access public
@@ -1081,3 +1097,31 @@ function run_migrate_indexing_acv($args, $opts) {
$stop = microtime(true);
CLI::logging("<*> Migrating and populating indexing for avoiding the use of table APP_CACHE_VIEW process took " . ($stop - $start) . " seconds.\n");
}
/**
* 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.");
}
}

View File

@@ -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

View File

@@ -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);
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,241 @@
<?php
namespace ProcessMaker\Util;
use Configurations;
use Criteria;
use ResultSet;
use FieldsPeer;
use ReportTablePeer;
use CaseConsolidatedCorePeer;
use ConsolidatedCases;
use AdditionalTablesPeer;
use PmTable;
use ReportVarPeer;
use AdditionalTables;
use stdClass;
/**
* This class regenerates the 'Propel' classes that are necessary for the
* administration of a 'Report Table', this is caused by the import of processes
* where the data directory of ProcessMaker has different routes.
*/
class FixReferencePath
{
private $modeDebug = false;
private $resumeDebug = "";
/**
* Get property modeDebug.
*
* @return boolean
*/
public function getModeDebug()
{
return $this->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");
}
}