. * * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. * */ G::LoadClass('case'); /** * ReportTables - Report tables class * @package ProcessMaker * @author Julio Cesar Laura Avendaņo * @copyright 2007 COLOSA */ class ReportTables { private $aDef = array('mysql' => array('number' => 'DOUBLE', 'char' => 'VARCHAR(255)', 'text' => 'TEXT', 'date' => 'DATETIME'), 'pgsql' => array('number' => 'DOUBLE', 'char' => 'VARCHAR(255)', 'text' => 'TEXT', 'date' => 'DATETIME')); //private $sPrefix = 'REP_'; private $sPrefix = ''; /** * Function deleteAllReportVars * This function delete all reports * @access public * @param string $$sRepTabUid * @return void */ public function deleteAllReportVars($sRepTabUid = '') { try { $oCriteria = new Criteria('workflow'); $oCriteria->add(ReportVarPeer::REP_TAB_UID, $sRepTabUid); ReportVarPeer::doDelete($oCriteria); } catch (Exception $oError) { throw($oError); } } /** * Function prepareQuery * This function removes the table * @access public * @param string $sTableName Table name * @param string $sConnection Conexion * @return void */ public function dropTable($sTableName, $sConnection = 'report') { $sTableName = $this->sPrefix . $sTableName; //we have to do the propel connection $PropelDatabase=$this->chooseDB($sConnection); $con = Propel::getConnection($PropelDatabase); $stmt = $con->createStatement(); try { switch (DB_ADAPTER) { case 'mysql': $rs = $stmt->executeQuery( 'DROP TABLE IF EXISTS `' . $sTableName . '`'); break; } } catch (Exception $oError) { throw($oError); } } /** * Function createTable * This Function creates the table * @access public * @param string $sTableName Table name * @param string $sConnection Connection name * @param string $sType * @param array $aFields * @param string $bDefaultFields * @return void */ public function createTable($sTableName, $sConnection = 'report', $sType = 'NORMAL', $aFields = array(), $bDefaultFields = true) { $sTableName = $this->sPrefix . $sTableName; //we have to do the propel connection $PropelDatabase=$this->chooseDB($sConnection); $con = Propel::getConnection($PropelDatabase); $stmt = $con->createStatement(); try { switch (DB_ADAPTER) { case 'mysql': $sQuery = 'CREATE TABLE IF NOT EXISTS `' . $sTableName . '` ('; if ($bDefaultFields) { $sQuery .= "`APP_UID` VARCHAR(32) NOT NULL DEFAULT '',`APP_NUMBER` INT NOT NULL,"; if ($sType == 'GRID') { $sQuery .= "`ROW` INT NOT NULL,"; } } foreach ($aFields as $aField) { switch ($aField['sType']) { case 'number': $sQuery .= '`' . $aField['sFieldName'] . '` ' . $this->aDef['mysql'][$aField['sType']] . " NOT NULL DEFAULT '0',"; break; case 'char': $sQuery .= '`' . $aField['sFieldName'] . '` ' . $this->aDef['mysql'][$aField['sType']] . " NOT NULL DEFAULT '',"; break; case 'text': $sQuery .= '`' . $aField['sFieldName'] . '` ' . $this->aDef['mysql'][$aField['sType']] . " ,"; break; case 'date': $sQuery .= '`' . $aField['sFieldName'] . '` ' . $this->aDef['mysql'][$aField['sType']] . " NOT NULL DEFAULT '0000-00-00 00:00:00',"; break; } } if ($bDefaultFields) { $sQuery .= 'PRIMARY KEY (APP_UID' . ($sType == 'GRID' ? ',ROW' : '') . ')) '; } $sQuery .= ' DEFAULT CHARSET=utf8;'; $rs = $stmt->executeQuery( $sQuery ); break; } } catch (Exception $oError) { throw($oError); } } /** * Function populateTable * This Function fills the table * @access public * @param string $sTableName Table name * @param string $sConnection Connection name * @param string $sType * @param array $aFields * @param string $sProcessUid * @param string $sGrid * @return void */ public function populateTable($sTableName, $sConnection = 'report', $sType = 'NORMAL', $aFields = array(), $sProcessUid = '', $sGrid = '') { $sTableName = $this->sPrefix . $sTableName; //we have to do the propel connection $PropelDatabase=$this->chooseDB($sConnection); $con = Propel::getConnection($PropelDatabase); $stmt = $con->createStatement(); if ($sType == 'GRID') { $aAux = explode('-', $sGrid); $sGrid = $aAux[0]; } try { 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) { $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); } } /** * Function getTableVars * @access public * @param string $sRepTabUid * @param boolean $bWhitType * @return void */ public function getTableVars($sRepTabUid, $bWhitType = false) { try { $oCriteria = new Criteria('workflow'); $oCriteria->add(ReportVarPeer::REP_TAB_UID, $sRepTabUid); $oDataset = ReportVarPeer::doSelectRS($oCriteria); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $oDataset->next(); $aVars = array(); while ($aRow = $oDataset->getRow()) { if ($bWhitType) { $aVars[] = array('sFieldName' => $aRow['REP_VAR_NAME'], 'sType' => $aRow['REP_VAR_TYPE']); } else { $aVars[] = $aRow['REP_VAR_NAME']; } $oDataset->next(); } return $aVars; } catch (Exception $oError) { throw($oError); } } /** * Function deleteReportTable * This Function deletes report table * @access public * @param string $sRepTabUid * @return void */ public function deleteReportTable($sRepTabUid) { try { $oReportTable = new ReportTable(); $aFields = $oReportTable->load($sRepTabUid); $this->dropTable($aFields['REP_TAB_NAME'], $aFields['REP_TAB_CONNECTION']); $oCriteria = new Criteria('workflow'); $oCriteria->add(ReportVarPeer::REP_TAB_UID, $sRepTabUid); $oDataset = ReportVarPeer::doDelete($oCriteria); $oReportTable->remove($sRepTabUid); } catch (Exception $oError) { throw($oError); } } /** * Function getSplitDate * This function gets the split date * @access public * @param date $date * @param string $mask * @return array */ function getSplitDate($date, $mask) { $sw1 = false; for($i=0; $i<3; $i++){ $item = substr($mask, $i*2, 1); switch($item){ case 'Y': switch($i){ case 0: $d1 = substr($date, 0, 4); break; case 1: $d1 = substr($date, 3, 4); break; case 2: $d1 = substr($date, 6, 4); break; } $sw1 = true; break; case 'y': switch($i){ case 0: $d1 = substr($date, 0, 2); break; case 1: $d1 = substr($date, 3, 2); break; case 2: $d1 = substr($date, 6, 2); break; } break; case 'm': switch($i){ case 0: $d2 = substr($date, 0, 2); break; case 1: $d2 = ($sw1)? substr($date, 5, 2): substr($date, 3, 2); break; case 2: $d2 = ($sw1)? substr($date, 8, 2): substr($date, 5, 2); break; } break; case 'd': switch($i){ case 0: $d3 = substr($date, 0, 2); break; case 1: $d3 = ($sw1)? substr($date, 5, 2): substr($date, 3, 2); break; case 2: $d3 = ($sw1)? substr($date, 8, 2): substr($date, 5, 2); break; } break; } } return Array(isset($d1)?$d1:'', isset($d2)?$d2:'', isset($d3)?$d3:''); } /** * Function getFormatDate * This function returns the date formated * @access public * @param date $sDate * @param date $sMask * @return date */ function getFormatDate($sDate, $sMask) { //print $sDate." *** ". $sMask."
"; $dateTime = explode(" ",$sDate); //To accept the Hour part $aDate = explode ( '-', str_replace("/", "-", $dateTime[0]) ); $bResult = true; foreach($aDate as $sDate){ if( !is_numeric($sDate) ){ $bResult = false; break; } } if( $sMask != '' ){ $aDate = $this->getSplitDate($dateTime[0], $sMask); $aDate[0] = ($aDate[0] == '')? date('Y'): $aDate[0]; $aDate[1] = ($aDate[1] == '')? date('m'): $aDate[1]; $aDate[2] = ($aDate[2] == '')? date('d'): $aDate[2]; if( checkdate($aDate[1], $aDate[2], $aDate[0]) ){ } else { return false; } } $sDateC=''; for($i=0;$i< count($aDate);$i++){ $sDateC.= (($i==0)?"":"-") .$aDate[$i]; } return ($sDateC); } /** * Function updateTables * This function updated the Report Tables * @access public * @param string $sProcessUid * @param string $sApplicationUid * @param string $iApplicationNumber * @param string $aFields * @return void */ public function updateTables($sProcessUid, $sApplicationUid, $iApplicationNumber, $aFields) { try { //get all Active Report Tables $oCriteria = new Criteria('workflow'); $oCriteria->add(ReportTablePeer::PRO_UID, $sProcessUid); $oCriteria->add(ReportTablePeer::REP_TAB_STATUS, 'ACTIVE'); $oDataset = ReportTablePeer::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']; $PropelDatabase=$this->chooseDB($aRow['REP_TAB_CONNECTION']); $con = Propel::getConnection($PropelDatabase); $stmt = $con->createStatement(); switch (DB_ADAPTER) { case 'mysql': $aTableFields = $this->getTableVars($aRow['REP_TAB_UID'], true); if ($aRow['REP_TAB_TYPE'] == 'NORMAL') { $sqlExists = "SELECT * FROM `" . $aRow['REP_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['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 { //remove old rows from database $sqlDelete = 'DELETE FROM `' . $aRow['REP_TAB_NAME'] . "` WHERE APP_UID = '" . $sApplicationUid . "'"; $rsDelete = $stmt->executeQuery( $sqlDelete ); $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 ); } } } break; } $oDataset->next(); } } catch (Exception $oError) { throw($oError); } } /** * Function tableExist * Check if table exists * @access public * @return boolean */ function tableExist() { $bExists = true; $oConnection = mysql_connect(DB_HOST, DB_USER, DB_PASS); mysql_select_db(DB_NAME); $oDataset = mysql_query('SELECT COUNT(*) FROM REPORT_TABLE') || ($bExists = false); return $bExists; } /** * Function chooseDB * Choose the database to connect * @access public * @param string $TabConnectionk * @return string */ function chooseDB($TabConnectionk) { $repTabConnection = trim( strtoupper( $TabConnectionk ) ); $PropelDatabase = 'rp'; if ( $repTabConnection == '' || $repTabConnection == 'REPORT' ) $PropelDatabase = 'rp'; if ( $repTabConnection == 'RBAC' ) $PropelDatabase = 'rbac'; if ( $repTabConnection == 'WF' ) $PropelDatabase = 'workflow'; return ($PropelDatabase); } }