diff --git a/workflow/engine/classes/model/AdditionalTables.php b/workflow/engine/classes/model/AdditionalTables.php index bbd07dad6..8cddaa07a 100644 --- a/workflow/engine/classes/model/AdditionalTables.php +++ b/workflow/engine/classes/model/AdditionalTables.php @@ -19,15 +19,38 @@ require_once 'classes/model/om/BaseAdditionalTables.php'; * @package workflow.engine.classes.model */ class AdditionalTables extends BaseAdditionalTables { - - public $fields = array(); - public $primaryKeys = array(); + private $aDef = array( + 'mysql' => array( + 'TEXT' => 'TEXT', + 'CHAR' => 'CHAR', + 'VARCHAR' => 'VARCHAR', + 'INT' => 'INT', + 'FLOAT' => 'FLOAT', + 'DATE' => 'DATE' + ), + 'pgsql' => array( + 'TEXT' => 'TEXT', + 'CHAR' => 'CHAR', + 'VARCHAR' => 'VARCHAR', + 'INT' => 'INTEGER', + 'FLOAT' => 'REAL', + 'DATE' => 'DATE' + ), + 'mssql' => array( + 'TEXT' => 'TEXT', + 'CHAR' => 'NCHAR', + 'VARCHAR' => 'NVARCHAR', + 'INT' => 'INTEGER', + 'FLOAT' => 'FLOAT', + 'DATE' => 'CHAR (19)' + ) + ); /** * Function load * access public */ - public function load($sUID, $bFields = false) { + public function load($sUID, $bFields = false) { try { $oAdditionalTables = AdditionalTablesPeer::retrieveByPK($sUID); if (!is_null($oAdditionalTables)) { @@ -84,7 +107,7 @@ class AdditionalTables extends BaseAdditionalTables { return $this->fields; } - + public function getPrimaryKeys() { $this->primaryKeys = array(); @@ -222,7 +245,23 @@ class AdditionalTables extends BaseAdditionalTables { $oConnection->begin(); $iResult = $oAdditionalTables->delete(); $oConnection->commit(); - + require_once 'classes/model/ShadowTable.php'; + if ($aAdditionalTables['ADD_TAB_SDW_AUTO_DELETE'] == 1) { + $oCriteria = new Criteria('workflow'); + $oCriteria->add(ShadowTablePeer::ADD_TAB_UID, $sUID); + ShadowTablePeer::doDelete($oCriteria); + } + else { + $oShadowTable = new ShadowTable(); + $oShadowTable->create(array( + 'ADD_TAB_UID' => $sUID, + 'SHD_ACTION' => 'DROP', + 'SHD_DETAILS' => '', + 'USR_UID' => (isset($_SESSION['USER_LOGGED']) ? $_SESSION['USER_LOGGED'] : ''), + 'APP_UID' => '', + 'SHD_DATE' => date('Y-m-d H:i:s')) + ); + } return $iResult; } else { @@ -234,27 +273,784 @@ class AdditionalTables extends BaseAdditionalTables { throw($oError); } } - - function deleteAll($id) - { - try{ - //deleting pm table - $additionalTable = AdditionalTables::load($id); - AdditionalTables::remove($id); + + function createTable($sTableName, $sConnection = '', $aFields = array()) { + + if ($sConnection == '' || $sConnection == 'wf') { + $sConnection = 'workflow'; + } + + try { + switch (DB_ADAPTER) { + case 'mysql': + + // trying to get a connection, if it doesn't exist Propel::getConnection() throws an exception + $con = Propel::getConnection($sConnection); + $stmt = $con->createStatement(); + + $sQuery = 'CREATE TABLE IF NOT EXISTS `' . $sTableName . '` ('; + $aPKs = array(); + foreach ($aFields as $aField) { + $aField['sFieldName'] = strtoupper($aField['sFieldName']); + switch ($aField['sType']) { + case 'VARCHAR': + $sQuery .= '`' . $aField['sFieldName'] . '` ' . $aField['sType'] . '(' . $aField['iSize'] . ')' . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " DEFAULT '',"; + break; + case 'TEXT': + $sQuery .= '`' . $aField['sFieldName'] . '` ' . $aField['sType'] . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " ,"; // " DEFAULT '',"; + break; + case 'DATE': + $sQuery .= '`' . $aField['sFieldName'] . '` ' . $aField['sType'] . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " ,"; // " DEFAULT '0000-00-00',"; + break; + case 'INT': + $sQuery .= '`' . $aField['sFieldName'] . '` ' . $aField['sType'] . '(' . $aField['iSize'] . ')' . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . ' ' . ($aField['bAI'] ? 'AUTO_INCREMENT' : "DEFAULT '0'") . ','; + if ($aField['bAI']) { + if (!in_array('`' . $aField['sFieldName'] . '`', $aPKs)) { + $aPKs[] = '`' . $aField['sFieldName'] . '`'; + } + } + break; + case 'FLOAT': + $sQuery .= '`' . $aField['sFieldName'] . '` ' . $aField['sType'] . '(' . $aField['iSize'] . ')' . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " DEFAULT '0',"; + break; + } + if ($aField['bPrimaryKey'] == 1) { + if (!in_array('`' . $aField['sFieldName'] . '`', $aPKs)) { + $aPKs[] = '`' . $aField['sFieldName'] . '`'; + } + } + } + $sQuery = substr($sQuery, 0, -1); + if (!empty($aPKs)) { + $sQuery .= ',PRIMARY KEY (' . implode(',', $aPKs) . ')'; + } + $sQuery .= ') DEFAULT CHARSET=utf8;'; + + $rs = $stmt->executeQuery('DROP TABLE IF EXISTS `' . $sTableName . '`'); + $rs = $stmt->executeQuery($sQuery); + break; + + case 'mysql2': + eval('$oConnection = @mysql_connect(' . $sDBHost . ', ' . $sDBUser . ', ' . $sDBPass . ');'); + if (!$oConnection) { + throw new Exception('Cannot connect to the server!'); + } + eval("if (!@mysql_select_db($sDBName)) { + throw new Exception('Cannot connect to the database ' . $sDBName . '!'); + }"); + $sQuery = 'CREATE TABLE IF NOT EXISTS `' . $sTableName . '` ('; + $aPKs = array(); + foreach ($aFields as $aField) { + $aField['sFieldName'] = strtoupper($aField['sFieldName']); + switch ($aField['sType']) { + case 'VARCHAR': + $sQuery .= '`' . $aField['sFieldName'] . '` ' . $aField['sType'] . '(' . $aField['iSize'] . ')' . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " DEFAULT '',"; + break; + case 'TEXT': + $sQuery .= '`' . $aField['sFieldName'] . '` ' . $aField['sType'] . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " ,"; // " DEFAULT '',"; + break; + case 'DATE': + $sQuery .= '`' . $aField['sFieldName'] . '` ' . $aField['sType'] . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " ,"; // " DEFAULT '0000-00-00',"; + break; + case 'INT': + $sQuery .= '`' . $aField['sFieldName'] . '` ' . $aField['sType'] . '(' . $aField['iSize'] . ')' . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . ' ' . ($aField['bAI'] ? 'AUTO_INCREMENT' : "DEFAULT '0'") . ','; + if ($aField['bAI']) { + if (!in_array('`' . $aField['sFieldName'] . '`', $aPKs)) { + $aPKs[] = '`' . $aField['sFieldName'] . '`'; + } + } + break; + case 'FLOAT': + $sQuery .= '`' . $aField['sFieldName'] . '` ' . $aField['sType'] . '(' . $aField['iSize'] . ')' . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " DEFAULT '0',"; + break; + } + if ($aField['bPrimaryKey'] == 1) { + if (!in_array('`' . $aField['sFieldName'] . '`', $aPKs)) { + $aPKs[] = '`' . $aField['sFieldName'] . '`'; + } + } + } + $sQuery = substr($sQuery, 0, -1); + if (!empty($aPKs)) { + $sQuery .= ',PRIMARY KEY (' . implode(',', $aPKs) . ')'; + } + $sQuery .= ') DEFAULT CHARSET=utf8;'; + if (!@mysql_query($sQuery)) { + throw new Exception('Cannot create the table "' . $sTableName . '"! ' . mysql_error() . ' SQL: ' . $sQuery); + } + break; + case 'mssql': + $sDBAdapter = DB_ADAPTER; + $sDBUser = DB_USER; + $sDBPass = DB_PASS; + $sDBHost = DB_HOST; // substr(DB_HOST, 0, strpos(DB_HOST,':')); + $sDBName = DB_NAME; + + $sDBHost = substr($sDBHost, 0, strpos($sDBHost,':')); + + $dsn = $sDBAdapter . '://' . $sDBUser . ':' . $sDBPass . '@' . $sDBHost . '/' . $sDBName; + + + $db =& DB::Connect( $dsn); + if (PEAR::isError($db)) { die($db->getMessage()); } + + $sQuery = 'CREATE TABLE ' . $sTableName . ' ('; + $aPKs = array(); + foreach ($aFields as $aField) { + switch ($aField['sType']) { + case 'VARCHAR': + $sQuery .= ' ' . $aField['sFieldName'] . ' ' . $aField['sType'] . '(' . $aField['iSize'] . ')' . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " DEFAULT '',"; + break; + case 'TEXT': + $sQuery .= ' ' . $aField['sFieldName'] . ' ' . $aField['sType'] . ' ,' ; ///-- " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " DEFAULT '',"; + break; + case 'DATE': + // In cases of incompatibility, use char(19) + $sQuery .= $aField['sFieldName'] . " char(19) " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " DEFAULT '0000-00-00',"; + break; + case 'INT': + $sQuery .= $aField['sFieldName'] . ' ' . $aField['sType'] . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . ' ' . ($aField['bAI'] ? 'AUTO_INCREMENT' : "DEFAULT '0'") . ','; + if ($aField['bAI']) { + if (!in_array(' ' . $aField['sFieldName'] . ' ', $aPKs)) { + $aPKs[] = ' ' . $aField['sFieldName'] . ' '; + } + } + break; + case 'FLOAT': + $sQuery .= ' ' . $aField['sFieldName'] . ' ' . $aField['sType'] . " " . ($aField['bNull'] ? 'NULL' : 'NOT NULL') . " DEFAULT '0',"; + break; + } + if ($aField['bPrimaryKey'] == 1) { + if (!in_array(' ' . $aField['sFieldName'] . ' ', $aPKs)) { + $aPKs[] = ' ' . $aField['sFieldName'] . ' '; + } + } + } + $sQuery = substr($sQuery, 0, -1); + if (!empty($aPKs)) { + $sQuery .= ',PRIMARY KEY (' . implode(',', $aPKs) . ')'; + } + $sQuery .= ') '; + $res = @$db->query($sQuery); + if (!$res) { + throw new Exception('Cannot create the table "' . $sTableName . '"!'); + } + + break; + + + } + } + catch (Exception $oError) { + throw($oError); + } + } + + function updateTable($sTableName, $sConnection = 'wf', $aNewFields = array(), $aOldFields = array()) { + $debug=false; + + if ($sConnection == '' || $sConnection == 'wf') { + $sConnection = 'workflow'; + } + try { + //$aKeys = array('PM_UNIQUE_ID'); + $aKeys = array(); + $aFieldsToAdd = array(); + $aFieldsToDelete = array(); + $aFieldsToAlter = array(); + + foreach ($aNewFields as $aNewField) { + $aNewField['FLD_NAME'] = strtoupper($aNewField['FLD_NAME']); + if (!isset($aOldFields[$aNewField['FLD_UID']])) { + $aFieldsToAdd[] = $aNewField; + } + + if ($aNewField['FLD_KEY'] == 1 || $aNewField['FLD_KEY'] === 'on' || $aNewField['FLD_AUTO_INCREMENT'] === 'on') { + if (!in_array($aNewField['FLD_NAME'], $aKeys)) { + $aKeys[] = $aNewField['FLD_NAME']; + } + } + + } + + foreach ($aOldFields as $aOldField) { + $aOldField['FLD_NAME'] = strtoupper($aOldField['FLD_NAME']); + if (!isset($aNewFields[$aOldField['FLD_UID']])) { + $aFieldsToDelete[] = $aOldField; + } + } + + if ($debug) { + echo 'new'; + print_r($aNewFields); + echo 'old'; + print_r($aOldFields); + echo 'to add'; + print_r($aFieldsToAdd); + echo 'keys'; + print_r($aKeys); + echo 'to delete'; + print_r($aFieldsToDelete); + } - //deleting fields - require_once 'classes/model/Fields.php'; - $criteria = new Criteria('workflow'); - $criteria->add(FieldsPeer::ADD_TAB_UID, $id); - FieldsPeer::doDelete($criteria); + foreach ($aNewFields as $aNewField) { + if (isset($aOldFields[$aNewField['FLD_UID']])) { + $aOldField = $aOldFields[$aNewField['FLD_UID']]; + $bEqual = true; + + if (trim($aNewField['FLD_NAME']) != trim($aOldField['FLD_NAME'])) { + $bEqual = false; + } + if (trim($aNewField['FLD_TYPE']) != trim($aOldField['FLD_TYPE'])) { + $bEqual = false; + } + if (trim($aNewField['FLD_SIZE']) != trim($aOldField['FLD_SIZE'])) { + $bEqual = false; + } + if (trim($aNewField['FLD_NULL']) != trim($aOldField['FLD_NULL'])) { + $bEqual = false; + } + if (trim($aNewField['FLD_AUTO_INCREMENT']) != trim($aOldField['FLD_AUTO_INCREMENT'])) { + $bEqual = false; + } + if (trim($aNewField['FLD_KEY']) != trim($aOldField['FLD_KEY'])) { + $bEqual = false; + } + if (!$bEqual) { + $aNewField['FLD_NAME_OLD'] = $aOldFields[$aNewField['FLD_UID']]['FLD_NAME']; + $aFieldsToAlter[] = $aNewField; + } + } + + } + + if ($debug) { + echo 'to alter'; print_r($aFieldsToAlter); + } + + G::LoadSystem('database_' . strtolower(DB_ADAPTER)); + $oDataBase = new database(DB_ADAPTER, DB_HOST, DB_USER, DB_PASS, DB_NAME); + $oDataBase->iFetchType = MYSQL_NUM; - //remove all related to pmTable - G::loadClass('pmTable'); - $pmTable = new pmTable($additionalTable['ADD_TAB_NAME']); - $pmTable->setDataSource($additionalTable['DBS_UID']); - $pmTable->remove(); - } catch (Exception $e) { - echo $e->getTraceAsString(); + //$oDataBase->executeQuery($oDataBase->generateDropPrimaryKeysSQL($sTableName)); + $con = Propel::getConnection($sConnection); + $stmt = $con->createStatement(); + + $sQuery = $oDataBase->generateDropPrimaryKeysSQL($sTableName); + if ($debug) { + echo 'sql drop pk'; + var_dump($sQuery); + } + try { + $rs = $stmt->executeQuery($sQuery); + } catch(PDOException $oException ) { + throw $oException; + } + + foreach ($aFieldsToDelete as $aFieldToDelete) { + //$oDataBase->executeQuery($oDataBase->generateDropColumnSQL($sTableName, strtoupper($aFieldToDelete['FLD_NAME']))); + $sQuery = $oDataBase->generateDropColumnSQL($sTableName, strtoupper($aFieldToDelete['FLD_NAME'])); + if ($debug) { + echo 'sql drop field'; + var_dump($sQuery); + } + $rs = $stmt->executeQuery($sQuery); + } + + foreach ($aFieldsToAdd as $aFieldToAdd) { + switch ($aFieldToAdd['FLD_TYPE']) { + case 'VARCHAR': + $aData = array( + 'Type' => 'VARCHAR(' . $aFieldToAdd['FLD_SIZE'] . ')', + 'Null' => ($aFieldToAdd['FLD_NULL'] == 1 || $aFieldToAdd['FLD_NULL'] === 'on' ? 'YES' : ''), + 'Default' => '' + ); + break; + case 'TEXT': + $aData = array( + 'Type' => 'TEXT', + 'Null' => ($aFieldToAdd['FLD_NULL'] == 1 || $aFieldToAdd['FLD_NULL'] === 'on' ? 'YES' : ''), + 'Default' => '' + ); + break; + case 'DATE': + $aData = array( + 'Type' => 'DATE', 'Null' => 'YES' + ); + // 'Null' => ($aFieldToAdd['FLD_NULL'] == 'on' ? 'YES' : ''), + // 'Default' => 'NULL'); // '0000-00-00'); + break; + case 'INT': + $aData = array( + 'Type' => 'INT(' . (int)$aFieldToAdd['FLD_SIZE'] . ')', + 'Null' => ($aFieldToAdd['FLD_NULL'] == 1 || $aFieldToAdd['FLD_NULL'] === 'on' ? 'YES' : ''), + 'Default' => '0', + 'AI' => ($aFieldToAdd['FLD_AUTO_INCREMENT'] == 1 || $aFieldToAdd['FLD_AUTO_INCREMENT'] === 'on' ? 1 : 0) + ); + break; + case 'FLOAT': + $aData = array( + 'Type' => 'FLOAT(' . (int)$aFieldToAdd['FLD_SIZE'] . ')', + 'Null' => ($aFieldToAdd['FLD_NULL'] == 1 || $aFieldToAdd['FLD_NULL'] == 'on' ? 'YES' : ''), + 'Default' => '0' + ); + break; + } + + //$oDataBase->executeQuery($oDataBase->generateAddColumnSQL($sTableName, strtoupper($aFieldToAdd['FLD_NAME']), $aData)); + $sQuery = $oDataBase->generateAddColumnSQL($sTableName, strtoupper($aFieldToAdd['FLD_NAME']), $aData); + if ($debug) { + echo 'sql add'; + var_dump($sQuery); + } + $rs = $stmt->executeQuery($sQuery); + } + + //$oDataBase->executeQuery($oDataBase->generateAddPrimaryKeysSQL($sTableName, $aKeys)); + $sQuery = $oDataBase->generateAddPrimaryKeysSQL($sTableName, $aKeys); + if ($debug) { + echo 'sql gen pk'; + var_dump($sQuery); + } + $rs = $stmt->executeQuery($sQuery); + + foreach ($aFieldsToAlter as $aFieldToAlter) { + switch ($aFieldToAlter['FLD_TYPE']) { + case 'VARCHAR': + $aData = array( + 'Type' => 'VARCHAR(' . $aFieldToAlter['FLD_SIZE'] . ')', + 'Null' => ($aFieldToAlter['FLD_NULL'] == 'on' ? 'YES' : ''), + 'Default' => '' + ); + break; + case 'TEXT': + $aData = array( + 'Type' => 'TEXT', + 'Null' => ($aFieldToAlter['FLD_NULL'] == 'on' ? 'YES' : ''), + 'Default' => '' + ); + break; + case 'DATE': + $aData = array( + 'Type' => 'DATE', 'Null' => 'YES' + ); + //'Null' => ($aFieldToAlter['FLD_NULL'] == 'on' ? 'YES' : ''), + //'Default' => 'NULL'); // '0000-00-00'); + break; + case 'INT': + $aData = array( + 'Type' => 'INT(' . (int)$aFieldToAlter['FLD_SIZE'] . ')', + 'Null' => ($aFieldToAlter['FLD_NULL'] == 'on' ? 'YES' : ''), + 'Default' => '0', + 'AI' => ($aFieldToAlter['FLD_AUTO_INCREMENT'] == 'on' ? 1 : 0) + ); + break; + case 'FLOAT': + $aData = array( + 'Type' => 'FLOAT(' . (int)$aFieldToAlter['FLD_SIZE'] . ')', + 'Null' => ($aFieldToAlter['FLD_NULL'] == 'on' ? 'YES' : ''), + 'Default' => '0' + ); + break; + } + //$oDataBase->executeQuery($oDataBase->generateChangeColumnSQL($sTableName, strtoupper($aFieldToAlter['FLD_NAME']), $aData, strtoupper($aFieldToAlter['FLD_NAME_OLD']))); + + $sQuery = $oDataBase->generateChangeColumnSQL($sTableName, strtoupper($aFieldToAlter['FLD_NAME']), $aData, strtoupper($aFieldToAlter['FLD_NAME_OLD'])); + if ($debug) { + echo 'sql alter'; + var_dump($sQuery); + } + $rs = $stmt->executeQuery($sQuery); + } + } + catch (Exception $oError) { + throw($oError); + } + } + + function createPropelClasses($sTableName, $sClassName, $aFields, $sAddTabUid, $connection='workflow') { + try { + /*$aUID = array('FLD_NAME' => 'PM_UNIQUE_ID', + 'FLD_TYPE' => 'INT', + 'FLD_SIZE' => '11', + 'FLD_KEY' => 'on', + 'FLD_NULL' => '', + 'FLD_AUTO_INCREMENT' => 'on'); + array_unshift($aFields, $aUID);*/ + $aTypes = array( + 'VARCHAR' => 'string', + 'TEXT' => 'string', + 'DATE' => 'int', + 'INT' => 'int', + 'FLOAT' => 'double' + ); + $aCreoleTypes = array( + 'VARCHAR' => 'VARCHAR', + 'TEXT' => 'LONGVARCHAR', + 'DATE' => 'TIMESTAMP', + 'INT' => 'INTEGER', + 'FLOAT' => 'DOUBLE' + ); + if ($sClassName == '') { + $sClassName = $this->getPHPName($sTableName); + } + + $sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP; + if (!file_exists($sPath)) { + G::mk_dir($sPath); + } + if (!file_exists($sPath . 'map')) { + G::mk_dir($sPath . 'map'); + } + if (!file_exists($sPath . 'om')) { + G::mk_dir($sPath . 'om'); + } + $aData = array(); + $aData['pathClasses'] = substr(PATH_DB, 0, -1); + $aData['tableName'] = $sTableName; + $aData['className'] = $sClassName; + $aData['connection'] = $connection; + $aData['GUID'] = $sAddTabUid; + + $aData['firstColumn'] = isset($aFields[0])? strtoupper($aFields[0]['FLD_NAME']) : strtoupper($aFields[1]['FLD_NAME']); + $aData['totalColumns'] = count($aFields); + $aData['useIdGenerator'] = 'false'; + $oTP1 = new TemplatePower(PATH_TPL . 'additionalTables' . PATH_SEP . 'Table.tpl'); + $oTP1->prepare(); + $oTP1->assignGlobal($aData); + file_put_contents($sPath . $sClassName . '.php', $oTP1->getOutputContent()); + $oTP2 = new TemplatePower(PATH_TPL . 'additionalTables' . PATH_SEP . 'TablePeer.tpl'); + $oTP2->prepare(); + $oTP2->assignGlobal($aData); + file_put_contents($sPath . $sClassName . 'Peer.php', $oTP2->getOutputContent()); + $aColumns = array(); + $aPKs = array(); + $aNotPKs = array(); + $i = 0; + foreach($aFields as $iKey => $aField) { + $aField['FLD_NAME'] = strtoupper($aField['FLD_NAME']); + if ($aField['FLD_TYPE']=='DATE') $aField['FLD_NULL'] = ''; + $aColumn = array( + 'name' => $aField['FLD_NAME'], + 'phpName' => $this->getPHPName($aField['FLD_NAME']), + 'type' => $aTypes[$aField['FLD_TYPE']], + 'creoleType' => $aCreoleTypes[$aField['FLD_TYPE']], + 'notNull' => ($aField['FLD_NULL'] == 'on' ? 'true' : 'false'), + 'size' => (($aField['FLD_TYPE'] == 'VARCHAR') || ($aField['FLD_TYPE'] == 'INT') || ($aField['FLD_TYPE'] == 'FLOAT') ? $aField['FLD_SIZE'] : 'null'), + 'var' => strtolower($aField['FLD_NAME']), + 'attribute' => (($aField['FLD_TYPE'] == 'VARCHAR') || ($aField['FLD_TYPE'] == 'TEXT') || ($aField['FLD_TYPE'] == 'DATE') ? '$' . strtolower($aField['FLD_NAME']) . " = ''" : '$' . strtolower($aField['FLD_NAME']) . ' = 0'), + 'index' => $i, + ); + if ($aField['FLD_TYPE'] == 'DATE') { + $aColumn['getFunction'] = '/** + * Get the [optionally formatted] [' . $aColumn['var'] . '] column value. + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the integer unix timestamp will be returned. + * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL). + * @throws PropelException - if unable to convert the date/time to timestamp. + */ + public function get' . $aColumn['phpName'] . '($format = "Y-m-d") + { + + if ($this->' . $aColumn['var'] . ' === null || $this->' . $aColumn['var'] . ' === "") { + return null; + } elseif (!is_int($this->' . $aColumn['var'] . ')) { + // a non-timestamp value was set externally, so we convert it + if (($this->' . $aColumn['var'] . ' == "0000-00-00 00:00:00") || ($this->' . $aColumn['var'] . ' == "0000-00-00") || !$this->' . $aColumn['var'] . ') { + $ts = "0"; + } + else { + $ts = strtotime($this->' . $aColumn['var'] . '); + } + if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE + throw new PropelException("Unable to parse value of [' . $aColumn['var'] . '] as date/time value: " . var_export($this->' . $aColumn['var'] . ', true)); + } + } else { + $ts = $this->' . $aColumn['var'] . '; + } + if ($format === null) { + return $ts; + } elseif (strpos($format, "%") !== false) { + return strftime($format, $ts); + } else { + return date($format, $ts); + } + }'; + } + else { + $aColumn['getFunction'] = '/** + * Get the [' . $aColumn['var'] . '] column value. + * + * @return string + */ + public function get' . $aColumn['phpName'] . '() + { + + return $this->' . $aColumn['var'] . '; + }'; + } + switch ($aField['FLD_TYPE']) { + case 'VARCHAR': + case 'TEXT': + $aColumn['setFunction'] = '// Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->' . $aColumn['var'] . ' !== $v) { + $this->' . $aColumn['var'] . ' = $v; + $this->modifiedColumns[] = ' . $aData['className'] . 'Peer::' . $aColumn['name'] . '; + }'; + break; + case 'DATE': + $aColumn['setFunction'] = 'if ($v !== null && !is_int($v)) { + // if($v == \'\') + // $ts = null; + // else + $ts = strtotime($v); + if ($ts === -1 || $ts === false) { // in PHP 5.1 return value changes to FALSE + //throw new PropelException("Unable to parse date/time value for [' . $aColumn['var'] . '] from input: " . var_export($v, true)); + } + } else { + $ts = $v; + } + if ($this->' . $aColumn['var'] . ' !== $ts) { + $this->' . $aColumn['var'] . ' = $ts; + $this->modifiedColumns[] = ' . $aData['className'] . 'Peer::' . $aColumn['name'] . '; + }'; + break; + case 'INT': + $aColumn['setFunction'] = '// Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && !is_int($v) && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->' . $aColumn['var'] . ' !== $v || $v === 1) { + $this->' . $aColumn['var'] . ' = $v; + $this->modifiedColumns[] = ' . $aData['className'] . 'Peer::' . $aColumn['name'] . '; + }'; + break; + case 'FLOAT': + $aColumn['setFunction'] = 'if ($this->' . $aColumn['var'] . ' !== $v || $v === 0) { + $this->' . $aColumn['var'] . ' = $v; + $this->modifiedColumns[] = ' . $aData['className'] . 'Peer::' . $aColumn['name'] . '; + }'; + break; + } + $aColumns[] = $aColumn; + if ($aField['FLD_KEY'] == 1 || $aField['FLD_KEY'] === 'on') { + $aPKs[] = $aColumn; + } + else { + $aNotPKs[] = $aColumn; + } + if ($aField['FLD_AUTO_INCREMENT'] == 1 || $aField['FLD_AUTO_INCREMENT'] === 'on') { + $aData['useIdGenerator'] = 'true'; + } + $i++; + } + $oTP3 = new TemplatePower(PATH_TPL . 'additionalTables' . PATH_SEP . 'map' . PATH_SEP . 'TableMapBuilder.tpl'); + $oTP3->prepare(); + $oTP3->assignGlobal($aData); + foreach ($aPKs as $iIndex => $aColumn) { + $oTP3->newBlock('primaryKeys'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP3->assign($sKey, $aColumn[$sKey]); + } + } + $oTP3->gotoBlock('_ROOT'); + foreach ($aNotPKs as $iIndex => $aColumn) { + $oTP3->newBlock('columnsWhitoutKeys'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP3->assign($sKey, $aColumn[$sKey]); + } + } + file_put_contents($sPath . PATH_SEP . 'map' . PATH_SEP . $sClassName . 'MapBuilder.php', $oTP3->getOutputContent()); + $oTP4 = new TemplatePower(PATH_TPL . 'additionalTables' . PATH_SEP . 'om' . PATH_SEP . 'BaseTable.tpl'); + $oTP4->prepare(); + switch (count($aPKs)) { + case 0: + $aData['getPrimaryKeyFunction'] = 'return null;'; + $aData['setPrimaryKeyFunction'] = ''; + break; + case 1: + $aData['getPrimaryKeyFunction'] = 'return $this->get' . $aPKs[0]['phpName'] . '();'; + $aData['setPrimaryKeyFunction'] = '$this->set' . $aPKs[0]['phpName'] . '($key);'; + break; + default: + $aData['getPrimaryKeyFunction'] = '$pks = array();' . "\n"; + $aData['setPrimaryKeyFunction'] = ''; + foreach ($aPKs as $iIndex => $aColumn) { + $aData['getPrimaryKeyFunction'] .= '$pks[' . $iIndex . '] = $this->get' . $aColumn['phpName'] . '();' . "\n"; + $aData['setPrimaryKeyFunction'] .= '$this->set' . $aColumn['phpName'] . '($keys[' . $iIndex . ']);' . "\n"; + } + $aData['getPrimaryKeyFunction'] .= 'return $pks;' . "\n"; + break; + } + $oTP4->assignGlobal($aData); + foreach ($aColumns as $iIndex => $aColumn) { + $oTP4->newBlock('allColumns1'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + $oTP4->newBlock('allColumns2'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + $oTP4->newBlock('allColumns3'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + $oTP4->newBlock('allColumns4'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + $oTP4->newBlock('allColumns5'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + $oTP4->newBlock('allColumns6'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + $oTP4->newBlock('allColumns7'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + $oTP4->newBlock('allColumns8'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + $oTP4->newBlock('allColumns9'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + } + $oTP4->gotoBlock('_ROOT'); + foreach ($aPKs as $iIndex => $aColumn) { + $oTP4->newBlock('primaryKeys1'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + } + $oTP4->gotoBlock('_ROOT'); + foreach ($aPKs as $iIndex => $aColumn) { + $oTP4->newBlock('primaryKeys2'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + } + $oTP4->gotoBlock('_ROOT'); + foreach ($aNotPKs as $iIndex => $aColumn) { + $oTP4->newBlock('columnsWhitoutKeys'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP4->assign($sKey, $aColumn[$sKey]); + } + } + file_put_contents($sPath . PATH_SEP . 'om' . PATH_SEP . 'Base' . $sClassName . '.php', $oTP4->getOutputContent()); + $oTP5 = new TemplatePower(PATH_TPL . 'additionalTables' . PATH_SEP . 'om' . PATH_SEP . 'BaseTablePeer.tpl'); + $oTP5->prepare(); + $sKeys = ''; + foreach ($aPKs as $iIndex => $aColumn) { + $sKeys .= '$' . $aColumn['var'] . ', '; + } + $sKeys = substr($sKeys, 0, -2); + //$sKeys = '$pm_unique_id'; + if ($sKeys != '') { + $aData['sKeys'] = $sKeys; + } + else { + $aData['sKeys'] = '$DUMMY'; + } + $oTP5->assignGlobal($aData); + foreach ($aColumns as $iIndex => $aColumn) { + $oTP5->newBlock('allColumns1'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + $oTP5->newBlock('allColumns2'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + $oTP5->newBlock('allColumns3'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + $oTP5->newBlock('allColumns4'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + $oTP5->newBlock('allColumns5'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + $oTP5->newBlock('allColumns6'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + $oTP5->newBlock('allColumns7'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + $oTP5->newBlock('allColumns8'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + $oTP5->newBlock('allColumns9'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + $oTP5->newBlock('allColumns10'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + } + $oTP5->gotoBlock('_ROOT'); + foreach ($aPKs as $iIndex => $aColumn) { + $oTP5->newBlock('primaryKeys1'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + } + foreach ($aPKs as $iIndex => $aColumn) { + $oTP5->newBlock('primaryKeys2'); + $aKeys = array_keys($aColumn); + foreach ($aKeys as $sKey) { + $oTP5->assign($sKey, $aColumn[$sKey]); + } + } + file_put_contents($sPath . PATH_SEP . 'om' . PATH_SEP . 'Base' . $sClassName . 'Peer.php', $oTP5->getOutputContent()); + } + catch (Exception $oError) { + throw($oError); } } @@ -274,6 +1070,116 @@ class AdditionalTables extends BaseAdditionalTables { } } + function deleteAll($sUID) { + try { + //deleting pm table + $aData = $this->load($sUID); + $this->remove($sUID); + + //deleting fields + require_once 'classes/model/Fields.php'; + $oCriteria = new Criteria('workflow'); + $oCriteria->add(FieldsPeer::ADD_TAB_UID, $sUID); + FieldsPeer::doDelete($oCriteria); + + //deleting table + if ($aData['DBS_UID'] == 'wf' || $aData['DBS_UID'] == 'workflow' || $aData['DBS_UID'] == '' || $aData['DBS_UID'] == '0' || !$aData['DBS_UID']) { + G::LoadSystem('database_' . strtolower(DB_ADAPTER)); + $oDataBase = new database(DB_ADAPTER, DB_HOST, DB_USER, DB_PASS, DB_NAME); + $oDataBase->iFetchType = MYSQL_NUM; + $oDataBase->executeQuery($oDataBase->generateDropTableSQL($aData['ADD_TAB_NAME'])); + } else { + $con = Propel::getConnection($aData['DBS_UID']); + if (is_object($con)) { + $stmt = $con->createStatement(); + $stmt->executeQuery('DROP TABLE '.$aData['ADD_TAB_NAME']); + } + } + + + //deleting clases + $sClassName = $this->getPHPName($aData['ADD_TAB_CLASS_NAME'] != '' ? $aData['ADD_TAB_CLASS_NAME'] : $aData['ADD_TAB_NAME']); + $sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP; + + @unlink($sPath . $sClassName . '.php'); + @unlink($sPath . $sClassName . 'Peer.php'); + @unlink($sPath . 'map' . PATH_SEP . $sClassName . 'MapBuilder.php'); + @unlink($sPath . 'om' . PATH_SEP . 'Base' . $sClassName . '.php'); + @unlink($sPath . 'om' . PATH_SEP . 'Base' . $sClassName . 'Peer.php'); + } + catch (Exception $oError) { + throw($oError); + } + } + + function createXmlList($sUID) { + try { + $aData = $this->load($sUID, true); + $sPath = PATH_DYNAFORM . 'xmlLists' . PATH_SEP; + if (!file_exists($sPath)) { + G::mk_dir($sPath); + } + file_put_contents($sPath . 'additionalTablesDataOptions.xml', ' + + + + + + ' . G::LoadTranslation("ID_NEW") . ' + + + + ' . G::LoadTranslation("ID_IMPORT") . ' + + + + + + + +'); + $sKeys = ''; + $sXml = '' . "\n"; + $sXml .= '' . "\n". + ' + ' . G::LoadTranslation("ID_TABLE") . ': '.$aData['ADD_TAB_NAME'].']]> + '; + + //$sXml .= '' . "\n"; + foreach ($aData['FIELDS'] as $aField) { + + $fZise = $aField['FLD_SIZE'] > (1024/sizeof($aData['FIELDS'])) ? $aField['FLD_SIZE']: 1024/sizeof($aData['FIELDS']); + + + $sXml .= '<' . $aField['FLD_NAME'] . ' type="text" colWidth="'.$fZise.'px" titleAlign="left" align="left">' . "\n"; + $sXml .= '<' . SYS_LANG . '>' . ($aField['FLD_DESCRIPTION'] != '' ? $aField['FLD_DESCRIPTION'] : $aField['FLD_NAME']) . '' . "\n"; + $sXml .= '' . "\n"; + if ($aField['FLD_KEY'] == 1) { + $sKeys .= $aField['FLD_NAME'] . '=@#' . $aField['FLD_NAME'] . '&'; + } + } + $sKeys = substr($sKeys, 0, -5); + $sXml .= '' . "\n"; + $sXml .= '' . "\n"; + $sXml .= ''; + file_put_contents($sPath . $sUID . '.xml', $sXml); + } + catch (Exception $oError) { + throw($oError); + } + } + function getDataCriteria($sUID) { try { $aData = $this->load($sUID, true); @@ -381,6 +1287,53 @@ class AdditionalTables extends BaseAdditionalTables { } } + + function createXmlEdit($sUID, $bEnableKeys) { + try { + $aData = $this->load($sUID, true); + $sPath = PATH_DYNAFORM . 'xmlLists' . PATH_SEP; + $sXml = '' . "\n"; + $sXml .= ''; + //$sXml .= ''; + $sXml .= ''; + foreach ($aData['FIELDS'] as $aField) { + switch ($aField['FLD_TYPE']) { + case 'VARCHAR': + if( intVal($aField['FLD_SIZE']) <= 100){ + $vCharType = 'text'; + $vCharAtt = 'size="' . $aField['FLD_SIZE'] . '" maxlength="' . $aField['FLD_SIZE'] . '" validate="Any"'; + } else { + $vCharType = 'textarea'; + $vCharAtt = 'rows="3" cols="90"'; + } + $sXml .= '<' . $aField['FLD_NAME'] . ' type="'.$vCharType.'" '. $vCharAtt .' required="' . (($aField['FLD_KEY'] == 1) && ($aField['FLD_AUTO_INCREMENT'] == 0) || ($aField['FLD_NULL'] == 0) ? '1' : '0') . '" readonly="0" mode="' . ($bEnableKeys ? 'edit' : ($aField['FLD_KEY'] == 1 ? 'view' : 'edit')) . '"><' . SYS_LANG . '>' . ($aField['FLD_DESCRIPTION'] != '' ? $aField['FLD_DESCRIPTION'] : $aField['FLD_NAME']) . '</' . SYS_LANG . '></' . $aField['FLD_NAME'] . '>'; + break; + case 'TEXT': + $sXml .= '<' . $aField['FLD_NAME'] . ' type="textarea" required="' . (($aField['FLD_KEY'] == 1) && ($aField['FLD_AUTO_INCREMENT'] == 0) || ($aField['FLD_NULL'] == 0) ? '1' : '0') . '" readonly="0" rows="8" cols="90" mode="' . ($bEnableKeys ? 'edit' : ($aField['FLD_KEY'] == 1 ? 'view' : 'edit')) . '"><' . SYS_LANG . '>' . ($aField['FLD_DESCRIPTION'] != '' ? $aField['FLD_DESCRIPTION'] : $aField['FLD_NAME']) . '</' . SYS_LANG . '></' . $aField['FLD_NAME'] . '>'; + break; + case 'DATE': + $sXml .= '<' . $aField['FLD_NAME'] . ' type="date" beforedate="-15y" afterdate="15y" mask="Y-m-d" required="' . ((($aField['FLD_KEY'] == 1) && ($aField['FLD_AUTO_INCREMENT'] == 0) || ($aField['FLD_NULL'] == 0) ) ? '1' : '0') . '" readonly="0" size="15" mode="' . ($bEnableKeys ? 'edit' : ($aField['FLD_KEY'] == 1 ? 'view' : 'edit')) . '"><' . SYS_LANG . '>' . ($aField['FLD_DESCRIPTION'] != '' ? $aField['FLD_DESCRIPTION'] : $aField['FLD_NAME']) . '</' . SYS_LANG . '></' . $aField['FLD_NAME'] . '>'; + break; + case 'INT': + $sXml .= '<' . $aField['FLD_NAME'] . ' type="text" maxlength="' . $aField['FLD_SIZE'] . '" validate="Int" required="' . (($aField['FLD_KEY'] == 1) && ($aField['FLD_AUTO_INCREMENT'] == 0) || ($aField['FLD_NULL'] == 0) ? '1' : '0') . '" readonly="0" size="' .($aField['FLD_SIZE']<=100?$aField['FLD_SIZE']:100). '" mode="' . ($bEnableKeys ? 'edit' : ($aField['FLD_KEY'] == 1 ? 'view' : 'edit')) . '"><' . SYS_LANG . '>' . ($aField['FLD_DESCRIPTION'] != '' ? $aField['FLD_DESCRIPTION'] : $aField['FLD_NAME']) . '</' . SYS_LANG . '></' . $aField['FLD_NAME'] . '>'; + break; + case 'FLOAT': + $sXml .= '<' . $aField['FLD_NAME'] . ' type="text" maxlength="' . $aField['FLD_SIZE'] . '" validate="Real" required="' . (($aField['FLD_KEY'] == 1) && ($aField['FLD_AUTO_INCREMENT'] == 0) || ($aField['FLD_NULL'] == 0) ? '1' : '0') . '" readonly="0" size="' . ($aField['FLD_SIZE']<=100?$aField['FLD_SIZE']:100) . '" mode="' . ($bEnableKeys ? 'edit' : ($aField['FLD_KEY'] == 1 ? 'view' : 'edit')) . '"><' . SYS_LANG . '>' . ($aField['FLD_DESCRIPTION'] != '' ? $aField['FLD_DESCRIPTION'] : $aField['FLD_NAME']) . '</' . SYS_LANG . '></' . $aField['FLD_NAME'] . '>'; + break; + } + } + $sXml .= '<btnSave type="submit"><' . SYS_LANG . '>' . G::LoadTranslation('ID_SAVE_CHANGES') . '</' . SYS_LANG . '></btnSave>'; + $sXml .= '<btnBack type="button" onclick="history.back()"><' . SYS_LANG . '>' . G::LoadTranslation('ID_CANCEL') . '</' . SYS_LANG . '></btnBack>'; + $sXml .= '</dynaForm>'; +// g::pr($aField); +// g::pr($sXml); die; + file_put_contents($sPath . $sUID . 'Edit.xml', $sXml); + } + catch (Exception $oError) { + throw($oError); + } + } + function saveDataInTable($sUID, $aFields) { try { $aData = $this->load($sUID, true); @@ -526,142 +1479,455 @@ class AdditionalTables extends BaseAdditionalTables { /** - * Populate the report table with all case data - * @param string $sType - * @param string $sProcessUid - * @param string $sGrid - * @return number + * Populate Report Table */ - public function populateReportTable($tableName, $sConnection = 'rp', $type = 'NORMAL', $processUid = '', $gridKey = '') + public function populateReportTable($sTableName, $sConnection = 'rp', $sType = 'NORMAL', $aFields = array(), $sProcessUid = '', $sGrid = '') { + 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: {$this->className} class file doesn't exit!"); - } - - require_once PATH_WORKSPACE . 'classes/' . $this->className . '.php'; - - //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); + if ($sType == 'GRID') { + $aAux = explode('-', $sGrid); + $sGrid = $aAux[0]; + } - 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']); - - if ($type == 'GRID') { - list($gridName, $gridUid) = explode('-', $gridKey); - $gridData = isset($caseData[$gridName]) ? $caseData[$gridName] : array(); - - foreach ($gridData as $i => $gridRow) { - eval('$obj = new ' .$this->className. '();'); - $obj->fromArray($caseData, BasePeer::TYPE_FIELDNAME); - $obj->setAppUid($row['APP_UID']); - $obj->setAppNumber($row['APP_NUMBER']); - $obj->fromArray(array_change_key_case($gridRow, CASE_UPPER), BasePeer::TYPE_FIELDNAME); - $obj->setRow($i); - $obj->save(); - eval('$obj = new ' .$this->className. '();'); - } - } 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']); - $obj->save(); - $obj = null; + try { + + $tableExists = true; + $sDataBase = 'database_' . strtolower(DB_ADAPTER); + if(G::LoadSystemExist($sDataBase)){ + G::LoadSystem($sDataBase); + $oDataBase = new database(); + $sDataBase = $sConnection; + if($sDataBase == 'rp') + $sDataBase = DB_REPORT_NAME; + if($sDataBase == 'workflow') + $sDataBase = DB_NAME; + $tableExists = $oDataBase->tableExists($sTableName, $sDataBase); } + if($tableExists) { + + switch (DB_ADAPTER) { + case 'mysql': + //select cases for this Process, ordered by APP_NUMBER + $oCriteria = new Criteria('workflow'); + $oCriteria->add(ApplicationPeer::PRO_UID, $sProcessUid); + $oCriteria->addAscendingOrderByColumn(ApplicationPeer::APP_NUMBER); + $oDataset = ApplicationPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $aData = unserialize($aRow['APP_DATA']); + + //delete previous record from this report table ( previous records in case this is a grid ) + $deleteSql = 'DELETE FROM `' . $sTableName . "` WHERE APP_UID = '" . $aRow['APP_UID'] . "'"; + $rsDel = $stmt->executeQuery( $deleteSql ); + if ($sType == 'NORMAL') { + $sQuery = 'INSERT INTO `' . $sTableName . '` ('; + $sQuery .= '`APP_UID`,`APP_NUMBER`'; + + foreach ($aFields as $aField) { + if ($aField['FLD_NAME'] != 'APP_UID' && $aField['FLD_NAME'] != 'APP_NUMBER' && $aField['FLD_NAME'] != 'ROW') + $sQuery .= ',`' . $aField['FLD_NAME'] . '`'; + } + + $sQuery .= ") VALUES ('" . $aRow['APP_UID'] . "'," . (int)$aRow['APP_NUMBER']; + foreach ($aFields as $aField) { + if ($aField['FLD_NAME'] == 'APP_UID' || $aField['FLD_NAME'] == 'APP_NUMBER' || $aField['FLD_NAME'] == 'ROW') continue; + + switch ($aField['FLD_TYPE']) { + case 'INT': + case 'FLOAT': + $sQuery .= ',' . (isset($aData[$aField['FLD_DYN_NAME']]) ? (float)str_replace(',', '', $aData[$aField['FLD_DYN_NAME']]) : '0'); + break; + case 'VARCHAR': + case 'TEXT': + if (!isset($aData[$aField['FLD_NAME']])) { + $aData[$aField['FLD_NAME']] = ''; + } + $sQuery .= ",'" . (isset($aData[$aField['FLD_DYN_NAME']]) ? mysql_real_escape_string($aData[$aField['FLD_DYN_NAME']]) : '') . "'"; + break; + case 'DATE': + $value = (isset($aData[$aField['FLD_DYN_NAME']]) && trim($aData[$aField['FLD_DYN_NAME']])) != '' ? "'" . $aData[$aField['FLD_DYN_NAME']] . "'" : 'NULL'; + $sQuery .= "," . $value; + break; + } + } + $sQuery .= ')'; + + $rs = $stmt->executeQuery( $sQuery ); + } + else { + if (isset($aData[$sGrid])) { + foreach ($aData[$sGrid] as $iRow => $aGridRow) { + $sQuery = 'INSERT INTO `' . $sTableName . '` ('; + $sQuery .= '`APP_UID`,`APP_NUMBER`,`ROW`'; + + foreach ($aFields as $aField) { + if ($aField['FLD_NAME'] != 'APP_UID' && $aField['FLD_NAME'] != 'APP_NUMBER' && $aField['FLD_NAME'] != 'ROW') + $sQuery .= ',`' . $aField['FLD_NAME'] . '`'; + } + + $sQuery .= ") VALUES ('" . $aRow['APP_UID'] . "'," . (int)$aRow['APP_NUMBER'] . ',' . $iRow; + foreach ($aFields as $aField) { + if ($aField['FLD_NAME'] != 'APP_UID' || $aField['FLD_NAME'] != 'APP_NUMBER' || $aField['FLD_NAME'] != 'ROW') continue; + + switch ($aField['FLD_TYPE']) { + case 'INT': + case 'FLOAT': + $sQuery .= ',' . (isset($aGridRow[$aField['FLD_NAME']]) ? (float)str_replace(',', '', $aGridRow[$aField['FLD_NAME']]) : '0'); + break; + case 'VARCHAR': + case 'TEXT': + if (!isset($aGridRow[$aField['FLD_NAME']])) { + $aGridRow[$aField['FLD_NAME']] = ''; + } + $sQuery .= ",'" . (isset($aGridRow[$aField['FLD_NAME']]) ? mysql_real_escape_string($aGridRow[$aField['FLD_NAME']]) : '') . "'"; + break; + case 'DATE': + $value = (isset($aGridRow[$aField['FLD_NAME']]) && trim($aGridRow[$aField['FLD_NAME']])) != '' ? "'" . $aGridRow[$aField['FLD_NAME']] . "'" : 'NULL'; + $sQuery .= "," . $value; + break; + } + } + $sQuery .= ')'; + $rs = $stmt->executeQuery( $sQuery ); + } + } + } + $oDataset->next(); + } + break; + + /** + * For SQLServer code + */ + case 'mssql': + $oCriteria = new Criteria('workflow'); + $oCriteria->add(ApplicationPeer::PRO_UID, $sProcessUid); + $oCriteria->addAscendingOrderByColumn(ApplicationPeer::APP_NUMBER); + $oDataset = ApplicationPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + while ($aRow = $oDataset->getRow()) { + $aData = unserialize($aRow['APP_DATA']); + mysql_query('DELETE FROM [' . $sTableName . "] WHERE APP_UID = '" . $aRow['APP_UID'] . "'"); + if ($sType == 'NORMAL') { + $sQuery = 'INSERT INTO [' . $sTableName . '] ('; + $sQuery .= '[APP_UID],[APP_NUMBER]'; + foreach ($aFields as $aField) { + $sQuery .= ',[' . $aField['sFieldName'] . ']'; + } + $sQuery .= ") VALUES ('" . $aRow['APP_UID'] . "'," . (int)$aRow['APP_NUMBER']; + foreach ($aFields as $aField) { + switch ($aField['sType']) { + case 'number': + $sQuery .= ',' . (isset($aData[$aField['sFieldName']]) ? (float)str_replace(',', '', $aData[$aField['sFieldName']]) : '0'); + break; + case 'char': + case 'text': + if (!isset($aData[$aField['sFieldName']])) { + $aData[$aField['sFieldName']] = ''; + } + $sQuery .= ",'" . (isset($aData[$aField['sFieldName']]) ? mysql_real_escape_string($aData[$aField['sFieldName']]) : '') . "'"; + break; + case 'date': + $sQuery .= ",'" . (isset($aData[$aField['sFieldName']]) ? $aData[$aField['sFieldName']] : '') . "'"; + break; + } + } + $sQuery .= ')'; + $rs = $stmt->executeQuery( $sQuery ); + } + else { + if (isset($aData[$sGrid])) { + foreach ($aData[$sGrid] as $iRow => $aGridRow) { + $sQuery = 'INSERT INTO [' . $sTableName . '] ('; + $sQuery .= '`APP_UID`,`APP_NUMBER`,`ROW`'; + foreach ($aFields as $aField) { + $sQuery .= ',[' . $aField['sFieldName'] . ']'; + } + $sQuery .= ") VALUES ('" . $aRow['APP_UID'] . "'," . (int)$aRow['APP_NUMBER'] . ',' . $iRow; + foreach ($aFields as $aField) { + switch ($aField['sType']) { + case 'number': + $sQuery .= ',' . (isset($aGridRow[$aField['sFieldName']]) ? (float)str_replace(',', '', $aGridRow[$aField['sFieldName']]) : '0'); + break; + case 'char': + case 'text': + if (!isset($aGridRow[$aField['sFieldName']])) { + $aGridRow[$aField['sFieldName']] = ''; + } + $sQuery .= ",'" . (isset($aGridRow[$aField['sFieldName']]) ? mysql_real_escape_string($aGridRow[$aField['sFieldName']]) : '') . "'"; + break; + case 'date': + $sQuery .= ",'" . (isset($aGridRow[$aField['sFieldName']]) ? $aGridRow[$aField['sFieldName']] : '') . "'"; + break; + } + } + $sQuery .= ')'; + $rs = $stmt->executeQuery( $sQuery ); + } + } + } + $oDataset->next(); + } + break; + + } + } + } + catch (Exception $oError) { + throw($oError); } } - /** - * Update the report table with a determinated case data - * @param string $proUid - * @param string $appUid - * @param string $appNumber - * @param string $caseData - */ - public function updateReportTables($proUid, $appUid, $appNumber, $caseData) - { - G::loadClass('pmTable'); - //get all Active Report Tables - $criteria = new Criteria('workflow'); - $criteria->add(AdditionalTablesPeer::PRO_UID, $proUid); - $dataset = AdditionalTablesPeer::doSelectRS($criteria); - $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - - // accomplish all related report tables for this process that contain case data for the target ($appUid) application - while ($dataset->next()) { - $row = $dataset->getRow(); - $className = $row['ADD_TAB_CLASS_NAME']; - // verify if the report table class exists - if (!file_exists (PATH_WORKSPACE . 'classes/' . $className . '.php') ) { - continue; - } - // the class exists then load it. - require_once PATH_WORKSPACE . 'classes/' . $className . '.php'; // - - // create a criteria object of report table class - $c = new Criteria(pmTable::resolveDbSource($row['DBS_UID'])); - // select all related records with this $appUid - eval('$c->add(' . $className . 'Peer::APP_UID, \'' . $appUid . '\');'); - eval('$records = ' . $className . 'Peer::doSelect($c);'); - switch ($row['ADD_TAB_TYPE']) { //switching by report table type - case 'NORMAL': - if (is_array($records) && count($records) > 0) { // if the record already exists on the report table - foreach ($records as $record) { //update all records - $record->fromArray(array_change_key_case($caseData, CASE_UPPER), BasePeer::TYPE_FIELDNAME); - if ($record->validate()) { - $record->save(); + + public function updateReportTables($sProcessUid, $sApplicationUid, $iApplicationNumber, $aFields) + { + try { + + //get all Active Report Tables + $oCriteria = new Criteria('workflow'); + $oCriteria->add(AdditionalTablesPeer::PRO_UID, $sProcessUid); + //$oCriteria->add(AdditionalTablesPeer::REP_TAB_STATUS, 'ACTIVE'); + $oDataset = AdditionalTablesPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + $aVars = array(); + + while ($aRow = $oDataset->getRow()) { + //$aRow['REP_TAB_NAME'] = $this->sPrefix . $aRow['REP_TAB_NAME']; + + $con = Propel::getConnection($aRow['DBS_UID']); + $stmt = $con->createStatement(); + switch (DB_ADAPTER) { + + case 'mysql': + $aTableFields = $this->getTableVars($aRow['ADD_TAB_UID'], true); + + if ($aRow['ADD_TAB_TYPE'] == 'NORMAL') { + $sqlExists = "SELECT * FROM `" . $aRow['ADD_TAB_NAME'] . "` WHERE APP_UID = '" . $sApplicationUid . "'"; + $rsExists = $stmt->executeQuery( $sqlExists, ResultSet::FETCHMODE_ASSOC); + $rsExists->next(); + $aRow2 = $rsExists->getRow(); + + if ( is_array( $aRow2) ) { + $sQuery = 'UPDATE `' . $aRow['ADD_TAB_NAME'] . '` SET '; + foreach ($aTableFields as $aField) { + + if ($aField['sFieldName'] == 'APP_UID' || $aField['sFieldName'] == 'APP_NUMBER' || $aField['sFieldName'] == 'ROW') continue; + $sQuery .= '`' . $aField['sFieldName'] . '` = '; + + switch ($aField['sType']) { + case 'FLOAT': + case 'INT': + $sQuery .= (isset($aFields[$aField['sFieldDynName']]) ? (float)str_replace(',', '', $aFields[$aField['sFieldDynName']]) : '0') . ','; + break; + case 'VARCHAR': + case 'TEXT': + if (!isset($aFields[$aField['sFieldDynName']])) { + $aFields[$aField['sFieldDynName']] = ''; + } + $sQuery .= "'" . (isset($aFields[$aField['sFieldDynName']]) ? mysql_real_escape_string($aFields[$aField['sFieldDynName']]) : '') . "',"; + break; + case 'DATE': + $mysqlDate = (isset($aFields[$aField['sFieldDynName']]) ? $aFields[$aField['sFieldDynName']] : '') ; + if ($mysqlDate!='') { + $mysqlDate = str_replace('/', '-', $mysqlDate); + $mysqlDate = date( 'Y-m-d', strtotime($mysqlDate) ); + } + $sQuery .= "'" . $mysqlDate . "',"; + break; + } + } + $sQuery = substr($sQuery, 0, -1); + $sQuery .= " WHERE APP_UID = '" . $sApplicationUid . "'"; + } + else { + $sQuery = 'INSERT INTO `' . $aRow['ADD_TAB_NAME'] . '` ('; + $sQuery .= '`APP_UID`,`APP_NUMBER`'; + foreach ($aTableFields as $aField) { + if ($aField['sFieldName'] != 'APP_UID' && $aField['sFieldName'] != 'APP_NUMBER' && $aField['sFieldName'] != 'ROW') + $sQuery .= ',`' . $aField['sFieldName'] . '`'; + } + $sQuery .= ") VALUES ('" . $sApplicationUid . "'," . (int)$iApplicationNumber; + foreach ($aTableFields as $aField) { + if ($aField['sFieldName'] == 'APP_UID' || $aField['sFieldName'] == 'APP_NUMBER' || $aField['sFieldName'] == 'ROW') continue; + + switch ($aField['sType']) { + case 'FLOAT': + case 'INT': + $sQuery .= ',' . (isset($aFields[$aField['sFieldDynName']]) ? (float)str_replace(',', '', $aFields[$aField['sFieldDynName']]) : '0'); + break; + case 'VARCHAR': + case 'TEXT': + if (!isset($aFields[$aField['sFieldDynName']])) { + $aFields[$aField['sFieldDynName']] = ''; + } + $sQuery .= ",'" . (isset($aFields[$aField['sFieldDynName']]) ? mysql_real_escape_string($aFields[$aField['sFieldDynName']]) : '') . "'"; + break; + case 'DATE': + $mysqlDate = ( isset($aFields[$aField['sFieldDynName']]) ? $aFields[$aField['sFieldDynName']] : '' ); + if ($mysqlDate!='') { + $mysqlDate = str_replace( '/', '-', $mysqlDate ); + $mysqlDate = date( 'Y-m-d', strtotime($mysqlDate) ); + } + $sQuery .= ",'" . $mysqlDate . "'"; + break; + } + } + $sQuery .= ')'; + } + + $rs = $stmt->executeQuery( $sQuery ); + } + else { + //remove old rows from database + $sqlDelete = 'DELETE FROM `' . $aRow['ADD_TAB_NAME'] . "` WHERE APP_UID = '" . $sApplicationUid . "'"; + $rsDelete = $stmt->executeQuery( $sqlDelete ); + + $aAux = explode('-', $aRow['ADD_TAB_GRID']); + if (isset($aFields[$aAux[0]])) { + foreach ($aFields[$aAux[0]] as $iRow => $aGridRow) { + $sQuery = 'INSERT INTO `' . $aRow['ADD_TAB_NAME'] . '` ('; + $sQuery .= '`APP_UID`,`APP_NUMBER`,`ROW`'; + foreach ($aTableFields as $aField) { + if ($aField['sFieldName'] != 'APP_UID' && $aField['sFieldName'] != 'APP_NUMBER' && $aField['sFieldName'] != 'ROW') + $sQuery .= ',`' . $aField['sFieldName'] . '`'; + } + $sQuery .= ") VALUES ('" . $sApplicationUid . "'," . (int)$iApplicationNumber . ',' . $iRow; + foreach ($aTableFields as $aField) { + if ($aField['sFieldName'] == 'APP_UID' || $aField['sFieldName'] == 'APP_NUMBER' || $aField['sFieldName'] == 'ROW') continue; + + switch ($aField['sType']) { + case 'FLOAT': + case 'INT': + $sQuery .= ',' . (isset($aGridRow[$aField['sFieldDynName']]) ? (float)str_replace(',', '', $aGridRow[$aField['sFieldDynName']]) : '0'); + break; + case 'VARCHAR': + case 'TEXT': + if (!isset($aGridRow[$aField['sFieldDynName']])) { + $aGridRow[$aField['sFieldDynName']] = ''; + } + $sQuery .= ",'" . (isset($aGridRow[$aField['sFieldDynName']]) ? mysql_real_escape_string($aGridRow[$aField['sFieldDynName']]) : '') . "'"; + break; + case 'DATE': + $sQuery .= ",'" . (isset($aGridRow[$aField['sFieldDynName']]) ? $aGridRow[$aField['sFieldDynName']] : '') . "'"; + break; + } + } + $sQuery .= ')'; + $rs =$stmt->executeQuery( $sQuery ); } } } - else { // there are not any record for this application on the table, then create it - eval('$obj = new ' . $className . '();'); - $obj->fromArray($caseData, BasePeer::TYPE_FIELDNAME); - $obj->setAppUid($appUid); - $obj->setAppNumber($appNumber); - $obj->save(); - } break; - - case 'GRID': - list($gridName, $gridUid) = explode('-', $row['ADD_TAB_GRID']); - $gridData = isset($caseData[$gridName]) ? $caseData[$gridName] : array(); - - // delete old records - if (is_array($records) && count($records) > 0) { - foreach ($records as $record) { - $record->delete(); + + /** + * For SQLServer code + */ + case 'mssql': + $aTableFields = $this->getTableVars($aRow['REP_TAB_UID'], true); + if ($aRow['REP_TAB_TYPE'] == 'NORMAL') { + $oDataset2 = mssql_query("SELECT * FROM [" . $aRow['REP_TAB_NAME'] . "] WHERE APP_UID = '" . $sApplicationUid . "'"); + if ($aRow2 = mssql_fetch_row($oDataset2)) { + $sQuery = 'UPDATE [' . $aRow['REP_TAB_NAME'] . '] SET '; + foreach ($aTableFields as $aField) { + $sQuery .= '[' . $aField['sFieldName'] . '] = '; + switch ($aField['sType']) { + case 'number': + $sQuery .= (isset($aFields[$aField['sFieldName']]) ? (float)str_replace(',', '', $aFields[$aField['sFieldName']]) : '0') . ','; + break; + case 'char': + case 'text': + if (!isset($aFields[$aField['sFieldName']])) { + $aFields[$aField['sFieldName']] = ''; + } + $sQuery .= "'" . (isset($aFields[$aField['sFieldName']]) ? mysql_real_escape_string($aFields[$aField['sFieldName']]) : '') . "',"; + break; + case 'date': + $sQuery .= "'" . (isset($aFields[$aField['sFieldName']]) ? $aFields[$aField['sFieldName']] : '') . "',"; + break; + } + } + $sQuery = substr($sQuery, 0, -1); + $sQuery .= " WHERE APP_UID = '" . $sApplicationUid . "'"; + } + else { + $sQuery = 'INSERT INTO [' . $aRow['REP_TAB_NAME'] . '] ('; + $sQuery .= '[APP_UID],[APP_NUMBER]'; + foreach ($aTableFields as $aField) { + $sQuery .= ',[' . $aField['sFieldName'] . ']'; + } + $sQuery .= ") VALUES ('" . $sApplicationUid . "'," . (int)$iApplicationNumber; + foreach ($aTableFields as $aField) { + switch ($aField['sType']) { + case 'number': + $sQuery .= ',' . (isset($aFields[$aField['sFieldName']]) ? (float)str_replace(',', '', $aFields[$aField['sFieldName']]) : '0'); + break; + case 'char': + case 'text': + if (!isset($aFields[$aField['sFieldName']])) { + $aFields[$aField['sFieldName']] = ''; + } + $sQuery .= ",'" . (isset($aFields[$aField['sFieldName']]) ? mysql_real_escape_string($aFields[$aField['sFieldName']]) : '') . "'"; + break; + case 'date': + $sQuery .= ",'" . (isset($aFields[$aField['sFieldName']]) ? $aFields[$aField['sFieldName']] : '') . "'"; + break; + } + } + $sQuery .= ')'; + } + $rs = $stmt->executeQuery( $sQuery ); + } + else { + mysql_query('DELETE FROM [' . $aRow['REP_TAB_NAME'] . "] WHERE APP_UID = '" . $sApplicationUid . "'"); + $aAux = explode('-', $aRow['REP_TAB_GRID']); + if (isset($aFields[$aAux[0]])) { + foreach ($aFields[$aAux[0]] as $iRow => $aGridRow) { + $sQuery = 'INSERT INTO [' . $aRow['REP_TAB_NAME'] . '] ('; + $sQuery .= '[APP_UID],[APP_NUMBER],[ROW]'; + foreach ($aTableFields as $aField) { + $sQuery .= ',[' . $aField['sFieldName'] . ']'; + } + $sQuery .= ") VALUES ('" . $sApplicationUid . "'," . (int)$iApplicationNumber . ',' . $iRow; + foreach ($aTableFields as $aField) { + switch ($aField['sType']) { + case 'number': + $sQuery .= ',' . (isset($aGridRow[$aField['sFieldName']]) ? (float)str_replace(',', '', $aGridRow[$aField['sFieldName']]) : '0'); + break; + case 'char': + case 'text': + if (!isset($aGridRow[$aField['sFieldName']])) { + $aGridRow[$aField['sFieldName']] = ''; + } + $sQuery .= ",'" . (isset($aGridRow[$aField['sFieldName']]) ? mysql_real_escape_string($aGridRow[$aField['sFieldName']]) : '') . "'"; + break; + case 'date': + $sQuery .= ",'" . (isset($aGridRow[$aField['sFieldName']]) ? $aGridRow[$aField['sFieldName']] : '') . "'"; + break; + } + } + $sQuery .= ')'; + $rs =$stmt->executeQuery( $sQuery ); + } + } } - } - // save all grid rows on grid type report table - foreach ($gridData as $i => $gridRow) { - eval('$obj = new ' . $className . '();'); - $obj->fromArray(array_change_key_case($gridRow, CASE_UPPER), BasePeer::TYPE_FIELDNAME); - $obj->setAppUid($appUid); - $obj->setAppNumber($appNumber); - $obj->setRow($i); - $obj->save(); - } break; + } + $oDataset->next(); } } + catch (Exception $oError) { + throw($oError); + } + } public function getTableVars($uid, $bWhitType = false) { diff --git a/workflow/engine/controllers/pmTablesProxy.php b/workflow/engine/controllers/pmTablesProxy.php index 62a05c8d1..b4b32bb9f 100644 --- a/workflow/engine/controllers/pmTablesProxy.php +++ b/workflow/engine/controllers/pmTablesProxy.php @@ -178,6 +178,155 @@ class pmTablesProxy extends HttpProxyController * save pm table */ public function save() + { + require_once 'classes/model/AdditionalTables.php'; + require_once 'classes/model/Fields.php'; + try { + $data = $_POST; + $data['PRO_UID'] = trim($data['PRO_UID']); + $data['columns'] = G::json_decode($_POST['columns']); //decofing data columns + $isReportTable = $data['PRO_UID'] != '' ? true : false; + + // Reserved Words + $aReservedWords = array( + 'ALTER', 'CLOSE', 'COMMIT', 'CREATE', 'DECLARE', + 'DELETE', 'DROP', 'FETCH', 'FUNCTION', 'GRANT', + 'INDEX', 'INSERT', 'OPEN', 'REVOKE', 'ROLLBACK', + 'SELECT', 'SYNONYM', 'TABLE', 'UPDATE', 'VIEW', + 'APP_UID', 'ROW' + ); + + $oAdditionalTables = new AdditionalTables(); + $oFields = new Fields(); + + // verify if exists. + $aNameTable = $oAdditionalTables->loadByName($data['REP_TAB_NAME']); + + $repTabClassName = $oAdditionalTables->getPHPName($data['REP_TAB_NAME']); + + $repTabData = array( + 'ADD_TAB_UID' => $data['REP_TAB_UID'], + 'ADD_TAB_NAME' => $data['REP_TAB_NAME'], + 'ADD_TAB_CLASS_NAME' => $repTabClassName, + 'ADD_TAB_DESCRIPTION' => $data['REP_TAB_DSC'], + 'ADD_TAB_PLG_UID' => '', + 'DBS_UID' => ($data['REP_TAB_CONNECTION'] ? $data['REP_TAB_CONNECTION'] : 'workflow'), + 'PRO_UID' => $data['PRO_UID'], + 'ADD_TAB_TYPE' => $data['REP_TAB_TYPE'], + 'ADD_TAB_GRID' => $data['REP_TAB_GRID'] + ); + + $columns = $data['columns']; + + if ($data['REP_TAB_UID'] == '') { //new report table + + if ($isReportTable) { //setting default columns + $defaultColumns = $this->_getReportTableDefaultColumns($data['REP_TAB_TYPE']); + $columns = array_merge($defaultColumns, $columns); + } + + /** validations **/ + if(is_array($aNameTable)) { + throw new Exception('The table "' . $data['REP_TAB_NAME'] . '" already exits.'); + } + + if (in_array(strtoupper($data['REP_TAB_NAME']), $aReservedWords) ) { + throw new Exception('Could not create the table with the name "' . $data['REP_TAB_NAME'] . '" because it is a reserved word.'); + } + //create record + $addTabUid = $oAdditionalTables->create($repTabData); + + } else { //editing report table + $addTabUid = $data['REP_TAB_UID']; + //loading old data before update + $addTabBeforeData = $oAdditionalTables->load($addTabUid, true); + //updating record + $oAdditionalTables->update($repTabData); + + //removing old data fields references + $oCriteria = new Criteria('workflow'); + $oCriteria->add(FieldsPeer::ADD_TAB_UID, $data['REP_TAB_UID']); + //$oCriteria->add(FieldsPeer::FLD_NAME, 'APP_UID', Criteria::NOT_EQUAL); + //$oCriteria->add(FieldsPeer::FLD_NAME, 'ROW', Criteria::NOT_EQUAL); + FieldsPeer::doDelete($oCriteria); + + //getting old fieldnames + $oldFields = array(); + foreach ($addTabBeforeData['FIELDS'] as $field) { + $oldFields[$field['FLD_UID']] = $field; + } + } + + $aFields = array(); + $fieldsList = array(); + $editFieldsList = array(); + + foreach ($columns as $i => $column) { + //new feature, to reorder the columns + // if (isset($oldFields[$column->uid])) { // the the field alreaday exists + // if ($oldFields[$column->uid]['FLD_INDEX'] != $i) { // if its index has changed + // $column->uid = ''; //set as new field, + // } + // } + + $field = array( + '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, + 'FLD_NULL' => (isset($column->field_null) && $column->field_null ? 1 : 0), + 'FLD_AUTO_INCREMENT' => (isset($column->field_autoincrement) && $column->field_autoincrement ? 1 : 0), + 'FLD_KEY' => (isset($column->field_key) && $column->field_key ? 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) + ); + + $fieldUid = $oFields->create($field); + $fieldsList[] = $field; + + if($data['REP_TAB_UID'] == '') { //new + $aFields[] = array( + 'sType' => $column->field_type, + 'iSize' => $column->field_size, + 'sFieldName' => $column->field_name, + 'bNull' => (isset($column->field_null) ? $column->field_null : 1), + 'bAI' => (isset($column->field_autoincrement) ? $column->field_autoincrement : 0), + 'bPrimaryKey' => (isset($column->field_key) ? $column->field_key : 0) + ); + } else { //editing + $field['FLD_UID'] = $fieldUid; + $aFields[$fieldUid] = $field; + } + } + if ($data['REP_TAB_UID'] == '') { //create a new report table + $oAdditionalTables->createTable($data['REP_TAB_NAME'], $data['REP_TAB_CONNECTION'], $aFields); + + } else { //editing + //print_R($aFields); + $oAdditionalTables->updateTable($data['REP_TAB_NAME'], $data['REP_TAB_CONNECTION'], $aFields, $oldFields); + } + $oAdditionalTables->createPropelClasses($data['REP_TAB_NAME'], '', $fieldsList, $addTabUid, $data['REP_TAB_CONNECTION']); + if ($isReportTable) { + $oAdditionalTables->populateReportTable($data['REP_TAB_NAME'], $data['REP_TAB_CONNECTION'], $data['REP_TAB_TYPE'], $fieldsList, $data['PRO_UID'], $data['REP_TAB_GRID']); + } + + $result->success = true; + } catch (Exception $e) { + $result->success = false; + $result->msg = $e->getMessage(); + $result->trace = $e->getTraceAsString(); + } + + return $result; + } + + public function save_moved() { require_once 'classes/model/AdditionalTables.php'; require_once 'classes/model/Fields.php'; diff --git a/workflow/engine/templates/additionalTables/Table.tpl b/workflow/engine/templates/additionalTables/Table.tpl new file mode 100644 index 000000000..8be3cc4aa --- /dev/null +++ b/workflow/engine/templates/additionalTables/Table.tpl @@ -0,0 +1,19 @@ +<?php + +require_once '{pathClasses}/' . SYS_SYS . '/classes/om/Base{className}.php'; + + +/** + * Skeleton subclass for representing a row from the '{tableName}' table. + * + * + * + * You should add additional methods to this class to meet the + * application requirements. This class will only be generated as + * long as it does not already exist in the output directory. + * + * @package classes.model + */ +class {className} extends Base{className} { + +} // {className} diff --git a/workflow/engine/templates/additionalTables/TablePeer.tpl b/workflow/engine/templates/additionalTables/TablePeer.tpl new file mode 100644 index 000000000..ad955b6bc --- /dev/null +++ b/workflow/engine/templates/additionalTables/TablePeer.tpl @@ -0,0 +1,23 @@ +<?php + + // include base peer class + require_once '{pathClasses}/' . SYS_SYS . '/classes/om/Base{className}Peer.php'; + + // include object class + include_once '{pathClasses}/' . SYS_SYS . '/classes/{className}.php'; + + +/** + * Skeleton subclass for performing query and update operations on the '{tableName}' table. + * + * + * + * You should add additional methods to this class to meet the + * application requirements. This class will only be generated as + * long as it does not already exist in the output directory. + * + * @package classes.model + */ +class {className}Peer extends Base{className}Peer { + +} // {className}Peer diff --git a/workflow/engine/templates/additionalTables/map/TableMapBuilder.tpl b/workflow/engine/templates/additionalTables/map/TableMapBuilder.tpl new file mode 100644 index 000000000..5877aca99 --- /dev/null +++ b/workflow/engine/templates/additionalTables/map/TableMapBuilder.tpl @@ -0,0 +1,78 @@ +<?php + +require_once PATH_THIRDPARTY . 'propel/map/MapBuilder.php'; +include_once PATH_THIRDPARTY . 'creole/CreoleTypes.php'; + + +/** + * This class adds structure of '{tableName}' table to '{connection}' DatabaseMap object. + * + * + * + * These statically-built map classes are used by Propel to do runtime db structure discovery. + * For example, the createSelectSql() method checks the type of a given column used in an + * ORDER BY clause to know whether it needs to apply SQL to make the ORDER BY case-insensitive + * (i.e. if it's a text column type). + * + * @package classes.model.map + */ +class {className}MapBuilder { + + /** + * The (dot-path) name of this class + */ + const CLASS_NAME = 'classes.model.map.{className}MapBuilder'; + + /** + * The database map. + */ + private $dbMap; + + /** + * Tells us if this DatabaseMapBuilder is built so that we + * don't have to re-build it every time. + * + * @return boolean true if this DatabaseMapBuilder is built, false otherwise. + */ + public function isBuilt() + { + return ($this->dbMap !== null); + } + + /** + * Gets the databasemap this map builder built. + * + * @return the databasemap + */ + public function getDatabaseMap() + { + return $this->dbMap; + } + + /** + * The doBuild() method builds the DatabaseMap + * + * @return void + * @throws PropelException + */ + public function doBuild() + { + $this->dbMap = Propel::getDatabaseMap('{connection}'); + + $tMap = $this->dbMap->addTable('{tableName}'); + + $tMap->setPhpName('{className}'); + + $tMap->setUseIdGenerator({useIdGenerator}); + +<!-- START BLOCK : primaryKeys --> + $tMap->addPrimaryKey('{name}', '{phpName}', '{type}', CreoleTypes::{creoleType}, {notNull}, {size}); +<!-- END BLOCK : primaryKeys --> + +<!-- START BLOCK : columnsWhitoutKeys --> + $tMap->addColumn('{name}', '{phpName}', '{type}', CreoleTypes::{creoleType}, {notNull}, {size}); +<!-- END BLOCK : columnsWhitoutKeys --> + + } // doBuild() + +} // {className}MapBuilder diff --git a/workflow/engine/templates/additionalTables/om/BaseTable.tpl b/workflow/engine/templates/additionalTables/om/BaseTable.tpl new file mode 100644 index 000000000..cba356cf5 --- /dev/null +++ b/workflow/engine/templates/additionalTables/om/BaseTable.tpl @@ -0,0 +1,530 @@ +<?php + +require_once PATH_THIRDPARTY . 'propel/om/BaseObject.php'; + +require_once PATH_THIRDPARTY . 'propel/om/Persistent.php'; + + +include_once PATH_THIRDPARTY . 'propel/util/Criteria.php'; + +include_once '{pathClasses}/' . SYS_SYS . '/classes/{className}Peer.php'; + +/** + * Base class that represents a row from the '{tableName}' table. + * + * + * + * @package classes.model.om + */ +abstract class Base{className} extends BaseObject implements Persistent { + + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var {className}Peer + */ + protected static $peer; + +<!-- START BLOCK : allColumns1 --> + /** + * The value for the {var} field. + * @var {type} + */ + protected {attribute}; +<!-- END BLOCK : allColumns1 --> + + /** + * Flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInSave = false; + + /** + * Flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + +<!-- START BLOCK : allColumns2 --> + {getFunction} + +<!-- END BLOCK : allColumns2 --> +<!-- START BLOCK : allColumns3 --> + /** + * Set the value of [{var}] column. + * + * @param {type} $v new value + * @return void + */ + public function set{phpName}($v) + { + {setFunction} + } // set{phpName}() + +<!-- END BLOCK : allColumns3 --> + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (1-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos. + * @param int $startcol 1-based offset column which indicates which restultset column to start with. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate(ResultSet $rs, $startcol = 1) + { + try { +<!-- START BLOCK : allColumns4 --> + $this->{var} = $rs->get{type2}($startcol + {index}); +<!-- END BLOCK : allColumns4 --> + + $this->resetModified(); + + $this->setNew(false); + + // FIXME - using NUM_COLUMNS may be clearer. + return $startcol + {totalColumns}; // {totalColumns} = {className}Peer::NUM_COLUMNS - {className}Peer::NUM_LAZY_LOAD_COLUMNS). + + } catch (Exception $e) { + throw new PropelException("Error populating {className} object", $e); + } + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param Connection $con + * @return void + * @throws PropelException + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete($con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection({className}Peer::DATABASE_NAME); + } + + try { + $con->begin(); + {className}Peer::doDelete($this, $con); + $this->setDeleted(true); + $con->commit(); + require_once 'classes/model/AdditionalTables.php'; + $oAdditionalTables = new AdditionalTables(); + $aAdditionalTables = $oAdditionalTables->load({className}Peer::__UID__); + if ($aAdditionalTables['ADD_TAB_SDW_LOG_DELETE'] == 1) { + require_once 'classes/model/ShadowTable.php'; + $oShadowTable = new ShadowTable(); + $oShadowTable->create(array('ADD_TAB_UID' => {className}Peer::__UID__, + 'SHD_ACTION' => 'DELETE', + 'SHD_DETAILS' => serialize($this->toArray(BasePeer::TYPE_FIELDNAME)), + 'USR_UID' => (isset($_SESSION['USER_LOGGED']) ? $_SESSION['USER_LOGGED'] : ''), + 'APP_UID' => (isset($_SESSION['APPLICATION']) ? $_SESSION['APPLICATION'] : ''), + 'SHD_DATE' => date('Y-m-d H:i:s'))); + } + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Stores the object in the database. If the object is new, + * it inserts it; otherwise an update is performed. This method + * wraps the doSave() worker method in a transaction. + * + * @param Connection $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see doSave() + */ + public function save($con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection({className}Peer::DATABASE_NAME); + } + + try { + $con->begin(); + $affectedRows = $this->doSave($con); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Stores the object in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param Connection $con + * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. + * @throws PropelException + * @see save() + */ + protected function doSave($con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + + // If this object has been modified, then save it to the database. + if ($this->isModified()) { + if ($this->isNew()) { + $pk = {className}Peer::doInsert($this, $con); + $affectedRows += 1; // we are assuming that there is only 1 row per doInsert() which + // should always be true here (even though technically + // BasePeer::doInsert() can insert multiple rows). + + $this->setNew(false); + $sAction = 'INSERT'; + $sField = 'ADD_TAB_SDW_LOG_INSERT'; + } else { + $affectedRows += {className}Peer::doUpdate($this, $con); + $sAction = 'UPDATE'; + $sField = 'ADD_TAB_SDW_LOG_UPDATE'; + } + require_once 'classes/model/AdditionalTables.php'; + $oAdditionalTables = new AdditionalTables(); + $aAdditionalTables = $oAdditionalTables->load({className}Peer::__UID__); + if ($aAdditionalTables[$sField] == 1) { + require_once 'classes/model/ShadowTable.php'; + $oShadowTable = new ShadowTable(); + $oShadowTable->create(array('ADD_TAB_UID' => {className}Peer::__UID__, + 'SHD_ACTION' => $sAction, + 'SHD_DETAILS' => serialize($this->toArray(BasePeer::TYPE_FIELDNAME)), + 'USR_UID' => (isset($_SESSION['USER_LOGGED']) ? $_SESSION['USER_LOGGED'] : ''), + 'APP_UID' => (isset($_SESSION['APPLICATION']) ? $_SESSION['APPLICATION'] : ''), + 'SHD_DATE' => date('Y-m-d H:i:s'))); + } + $this->resetModified(); // [HL] After being saved an object is no longer 'modified' + } + + $this->alreadyInSave = false; + } + return $affectedRows; + } // doSave() + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + return true; + } else { + $this->validationFailures = $res; + return false; + } + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then <code>true</code> is returned; otherwise + * an aggreagated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed <code>true</code> if all validations pass; array of <code>ValidationFailed</code> objets otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = {className}Peer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = {className}Peer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + return $this->getByPosition($pos); + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch($pos) { +<!-- START BLOCK : allColumns5 --> + case {index}: + return $this->get{phpName}(); + break; +<!-- END BLOCK : allColumns5 --> + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME) + { + $keys = {className}Peer::getFieldNames($keyType); + $result = array( +<!-- START BLOCK : allColumns6 --> + $keys[{index}] => $this->get{phpName}(), +<!-- START BLOCK : allColumns6 --> + ); + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = {className}Peer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch($pos) { +<!-- START BLOCK : allColumns7 --> + case {index}: + $this->set{phpName}($value); + break; +<!-- END BLOCK : allColumns7 --> + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, + * TYPE_NUM. The default key type is the column's phpname (e.g. 'authorId') + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = {className}Peer::getFieldNames($keyType); +<!-- START BLOCK : allColumns8 --> + if (array_key_exists($keys[{index}], $arr)) $this->set{phpName}($arr[$keys[{index}]]); +<!-- END BLOCK : allColumns8 --> + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria({className}Peer::DATABASE_NAME); +<!-- START BLOCK : allColumns9 --> + if ($this->isColumnModified({className}Peer::{name})) $criteria->add({className}Peer::{name}, $this->{var}); +<!-- END BLOCK : allColumns9 --> + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria({className}Peer::DATABASE_NAME); +<!-- START BLOCK : primaryKeys1 --> + $criteria->add({className}Peer::{name}, $this->{var}); +<!-- END BLOCK : primaryKeys1 --> + return $criteria; + } + + /** + * Returns the primary key for this object (row). + * @return string + */ + public function getPrimaryKey() + { + {getPrimaryKeyFunction} + } + + /** + * Generic method to set the primary key (add_tab_uid column). + * + * @param string $key Primary key. + * @return void + */ + public function setPrimaryKey($key) + { + {setPrimaryKeyFunction} + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of {className} (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false) + { +<!-- START BLOCK : columnsWhitoutKeys --> + $copyObj->set{phpName}($this->{var}); +<!-- END BLOCK : columnsWhitoutKeys --> + + $copyObj->setNew(true); +<!-- START BLOCK : primaryKeys2 --> + $copyObj->set{phpName}({defaultValue}); // this is a pkey column, so set to default value +<!-- END BLOCK : primaryKeys2 --> + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return {className} Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return {className}Peer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new {className}Peer(); + } + return self::$peer; + } + +} // Base{className} diff --git a/workflow/engine/templates/additionalTables/om/BaseTablePeer.tpl b/workflow/engine/templates/additionalTables/om/BaseTablePeer.tpl new file mode 100644 index 000000000..bcbbb9446 --- /dev/null +++ b/workflow/engine/templates/additionalTables/om/BaseTablePeer.tpl @@ -0,0 +1,584 @@ +<?php + +require_once PATH_THIRDPARTY . 'propel/util/BasePeer.php'; +// The object class -- needed for instanceof checks in this class. +// actual class may be a subclass -- as returned by {className}Peer::getOMClass() +include_once '{pathClasses}/' . SYS_SYS . '/classes/{className}.php'; + +/** + * Base static class for performing query and update operations on the '{tableName}' table. + * + * + * + * @package classes.model.om + */ +abstract class Base{className}Peer { + + /** the default database name for this class */ + const DATABASE_NAME = '{connection}'; + + /** the table name for this class */ + const TABLE_NAME = '{tableName}'; + + /** the table GUID for this class */ + const __UID__ = '{GUID}'; + + /** A class that can be returned by this peer. */ + const CLASS_DEFAULT = 'classes.model.{className}'; + + /** The total number of columns. */ + const NUM_COLUMNS = {totalColumns}; + + /** The number of lazy-loaded columns. */ + const NUM_LAZY_LOAD_COLUMNS = 0; + +<!-- START BLOCK : allColumns1 --> + /** the column name for the {name} field */ + const {name} = '{tableName}.{name}'; +<!-- END BLOCK : allColumns1 --> + + /** The PHP to DB Name Mapping */ + private static $phpNameMap = null; + + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' + */ + private static $fieldNames = array ( + BasePeer::TYPE_PHPNAME => array ( +<!-- START BLOCK : allColumns2 --> +'{phpName}', +<!-- END BLOCK : allColumns2 --> +), + BasePeer::TYPE_COLNAME => array ( +<!-- START BLOCK : allColumns3 --> +{className}Peer::{name}, +<!-- END BLOCK : allColumns3 --> +), + BasePeer::TYPE_FIELDNAME => array ( +<!-- START BLOCK : allColumns4 --> +'{name}', +<!-- END BLOCK : allColumns4 --> +), + BasePeer::TYPE_NUM => array ( +<!-- START BLOCK : allColumns5 --> +{index}, +<!-- END BLOCK : allColumns5 --> +)); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + private static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ( +<!-- START BLOCK : allColumns6 --> +'{phpName}' => {index}, +<!-- END BLOCK : allColumns6 --> +), + BasePeer::TYPE_COLNAME => array ( +<!-- START BLOCK : allColumns7 --> +{className}Peer::{name} => {index}, +<!-- END BLOCK : allColumns7 --> +), + BasePeer::TYPE_FIELDNAME => array ( +<!-- START BLOCK : allColumns8 --> +'{name}' => {index}, +<!-- END BLOCK : allColumns8 --> +), + BasePeer::TYPE_NUM => array ( +<!-- START BLOCK : allColumns9 --> +{index}, +<!-- START BLOCK : allColumns9 --> +)); + + /** + * @return MapBuilder the map builder for this peer + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getMapBuilder() + { + include_once '{pathClasses}/' . SYS_SYS . '/classes/map/{className}MapBuilder.php'; + return BasePeer::getMapBuilder('classes.model.map.{className}MapBuilder'); + } + /** + * Gets a map (hash) of PHP names to DB column names. + * + * @return array The PHP to DB name map for this peer + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @deprecated Use the getFieldNames() and translateFieldName() methods instead of this. + */ + public static function getPhpNameMap() + { + if (self::$phpNameMap === null) { + $map = {className}Peer::getTableMap(); + $columns = $map->getColumns(); + $nameMap = array(); + foreach ($columns as $column) { + $nameMap[$column->getPhpName()] = $column->getColumnName(); + } + self::$phpNameMap = $nameMap; + } + return self::$phpNameMap; + } + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + */ + static public function translateFieldName($name, $fromType, $toType) + { + $toNames = self::getFieldNames($toType); + $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); + } + return $toNames[$key]; + } + + /** + * Returns an array of of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return array A list of field names + */ + + static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, self::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.'); + } + return self::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * <code> + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * </code> + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. {className}Peer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace({className}Peer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param criteria object containing the columns to add. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria) + { +<!-- START BLOCK : allColumns10 --> + $criteria->addSelectColumn({className}Peer::{name}); +<!-- END BLOCK : allColumns10 --> + } + + const COUNT = 'COUNT({tableName}.{firstColumn})'; + const COUNT_DISTINCT = 'COUNT(DISTINCT {tableName}.{firstColumn})'; + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns (You can also set DISTINCT modifier in Criteria). + * @param Connection $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, $con = null) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // clear out anything that might confuse the ORDER BY clause + $criteria->clearSelectColumns()->clearOrderByColumns(); + if ($distinct || in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->addSelectColumn({className}Peer::COUNT_DISTINCT); + } else { + $criteria->addSelectColumn({className}Peer::COUNT); + } + + // just in case we're grouping: add those columns to the select statement + foreach($criteria->getGroupByColumns() as $column) + { + $criteria->addSelectColumn($column); + } + + $rs = {className}Peer::doSelectRS($criteria, $con); + if ($rs->next()) { + return $rs->getInt(1); + } else { + // no rows returned; we infer that means 0 matches. + return 0; + } + } + /** + * Method to select one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param Connection $con + * @return {className} + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = {className}Peer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + return null; + } + /** + * Method to do selects. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param Connection $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, $con = null) + { + return {className}Peer::populateObjects({className}Peer::doSelectRS($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() + * method to get a ResultSet. + * + * Use this method directly if you want to just get the resultset + * (instead of an array of objects). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param Connection $con the connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return ResultSet The resultset object with numerically-indexed fields. + * @see BasePeer::doSelect() + */ + public static function doSelectRS(Criteria $criteria, $con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + + if (!$criteria->getSelectColumns()) { + $criteria = clone $criteria; + {className}Peer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(self::DATABASE_NAME); + + // BasePeer returns a Creole ResultSet, set to return + // rows indexed numerically. + return BasePeer::doSelect($criteria, $con); + } + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(ResultSet $rs) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = {className}Peer::getOMClass(); + $cls = Propel::import($cls); + // populate the object(s) + while($rs->next()) { + + $obj = new $cls(); + $obj->hydrate($rs); + $results[] = $obj; + + } + return $results; + } + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); + } + + /** + * The class that the Peer will make instances of. + * + * This uses a dot-path notation which is tranalted into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @return string path.to.ClassName + */ + public static function getOMClass() + { + return {className}Peer::CLASS_DEFAULT; + } + + /** + * Method perform an INSERT on the database, given a {className} or Criteria object. + * + * @param mixed $values Criteria or {className} object containing data that is used to create the INSERT statement. + * @param Connection $con the connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from {className} object + } + + + // Set the correct dbName + $criteria->setDbName(self::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->begin(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch(PropelException $e) { + $con->rollback(); + throw $e; + } + + return $pk; + } + + /** + * Method perform an UPDATE on the database, given a {className} or Criteria object. + * + * @param mixed $values Criteria or {className} object containing data that is used to create the UPDATE statement. + * @param Connection $con The connection to use (specify Connection object to exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + + $selectCriteria = new Criteria(self::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity +<!-- START BLOCK : primaryKeys1 --> + $comparison = $criteria->getComparison({className}Peer::{name}); + $selectCriteria->add({className}Peer::{name}, $criteria->remove({className}Peer::{name}), $comparison); +<!-- END BLOCK : primaryKeys1 --> + } else { // $values is {className} object + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(self::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Method to DELETE all rows from the {tableName} table. + * + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll($con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->begin(); + $affectedRows += BasePeer::doDeleteAll({className}Peer::TABLE_NAME, $con); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Method perform a DELETE on the database, given a {className} or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or {className} object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param Connection $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection({className}Peer::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } elseif ($values instanceof {className}) { + + $criteria = $values->buildPkeyCriteria(); + } else { + // it must be the primary key + $criteria = new Criteria(self::DATABASE_NAME); + {forDoDeleteFunction} + } + + // Set the correct dbName + $criteria->setDbName(self::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->begin(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Validates all modified columns of given {className} object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param {className} $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate({className} $obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap({className}Peer::DATABASE_NAME); + $tableMap = $dbMap->getTable({className}Peer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach($cols as $colName) { + if ($tableMap->containsColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate({className}Peer::DATABASE_NAME, {className}Peer::TABLE_NAME, $columns); + } + + /** + * Retrieve a single object by pkey. + * + * @param mixed $pk the primary key. + * @param Connection $con the connection to use + * @return {className} + */ + public static function retrieveByPK( {sKeys}, $con = null) { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + $criteria = new Criteria(); + +<!-- START BLOCK : primaryKeys2 --> + $criteria->add({className}Peer::{name}, ${var}); +<!-- START BLOCK : primaryKeys2 --> + + //$criteria->add({className}Peer::PM_UNIQUE_ID, $pm_unique_id); + $v = {className}Peer::doSelect($criteria, $con); + + return !empty($v) ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param Connection $con the connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + {retrieveByPKsFunction} + +} // Base{className}Peer + +// static code to register the map builder for this Peer with the main Propel class +if (Propel::isInit()) { + // the MapBuilder classes register themselves with Propel during initialization + // so we need to load them here. + try { + Base{className}Peer::getMapBuilder(); + } catch (Exception $e) { + Propel::log('Could not initialize Peer: ' . $e->getMessage(), Propel::LOG_ERR); + } +} else { + // even if Propel is not yet initialized, the map builder class can be registered + // now and then it will be loaded when Propel initializes. + require_once '{pathClasses}/' . SYS_SYS . '/classes/map/{className}MapBuilder.php'; + Propel::registerMapBuilder('classes.model.map.{className}MapBuilder'); +} diff --git a/workflow/engine/templates/pmTables/edit.js b/workflow/engine/templates/pmTables/edit.js index d397980e2..b5bc9adf2 100644 --- a/workflow/engine/templates/pmTables/edit.js +++ b/workflow/engine/templates/pmTables/edit.js @@ -193,8 +193,8 @@ Ext.onReady(function(){ forceSelection: true, store: new Ext.data.SimpleStore({ fields: ['type_id', 'type'], - //data : [['VARCHAR',_("ID_VARCHAR")],['TEXT',_("ID_TEXT")],['DATE',_("ID_DATE")],['INT',_("ID_INT")],['FLOAT',_("ID_FLOAT")]], - data: columnsTypes, + data : [['VARCHAR',_("ID_VARCHAR")],['TEXT',_("ID_TEXT")],['DATE',_("ID_DATE")],['INT',_("ID_INT")],['FLOAT',_("ID_FLOAT")]], + //data: columnsTypes, sortInfo: {field:'type_id', direction:'ASC'} }) }) diff --git a/workflow/engine/templates/pmTables/editReport.js b/workflow/engine/templates/pmTables/editReport.js index 4f2047222..85d9693ad 100644 --- a/workflow/engine/templates/pmTables/editReport.js +++ b/workflow/engine/templates/pmTables/editReport.js @@ -313,8 +313,8 @@ Ext.onReady(function(){ valueField:'type_id', store: new Ext.data.SimpleStore({ fields: ['type_id', 'type'], - //data : [['VARCHAR',_("ID_VARCHAR")],['TEXT',_("ID_TEXT")],['DATE',_("ID_DATE")],['INT',_("ID_INT")],['FLOAT',_("ID_FLOAT")]], - data: columnsTypes, + data : [['VARCHAR',_("ID_VARCHAR")],['TEXT',_("ID_TEXT")],['DATE',_("ID_DATE")],['INT',_("ID_INT")],['FLOAT',_("ID_FLOAT")]], + //data: columnsTypes, sortInfo: {field:'type_id', direction:'ASC'} }) })