<?php

/**
 * AdditionalTables.php
 * @package    workflow.engine.classes.model
 */
require_once 'classes/model/om/BaseAdditionalTables.php';

/**
 * Skeleton subclass for representing a row from the 'ADDITIONAL_TABLES' 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.
 * <juliocesar@colosa.com, julces2000@gmail.com>
 *
 * @package    workflow.engine.classes.model
 */

function validateType ($value, $type)
{
    switch ($type) {
        case 'INTEGER':
            $value = str_replace(",", "", $value);
            $value = str_replace(".", "", $value);
            break;
        case 'FLOAT':
        case 'DOUBLE':
            $pos = strrpos($value, ",");
            $pos = ($pos === false) ? 0 : $pos;

            $posPoint = strrpos($value, ".");
            $posPoint = ($posPoint === false) ? 0 : $posPoint;

            if ($pos > $posPoint) {
                $value2 = substr($value, $pos+1);
                $value1 = substr($value, 0, $pos);
                $value1 = str_replace(".", "", $value1);
                $value = $value1.".".$value2;
            } else {
                if($posPoint) {
                    $value2 = substr($value, $posPoint+1);
                    $value1 = substr($value, 0, $posPoint);
                    $value1 = str_replace(",", "", $value1);
                    $value = $value1.".".$value2;
                }
            }
            break;
        default:
            break;
    }
    return $value;
}

class AdditionalTables extends BaseAdditionalTables
{
    public $fields = array();
    public $primaryKeys = array();

    /**
     * Function load
     * access public
     */
    public function load($sUID, $bFields = false)
    {
        $oAdditionalTables = AdditionalTablesPeer::retrieveByPK($sUID);

        if (is_null($oAdditionalTables)) {
            return null;
        }

        $aFields = $oAdditionalTables->toArray(BasePeer::TYPE_FIELDNAME);
        $this->fromArray($aFields, BasePeer::TYPE_FIELDNAME);

        if ($bFields) {
            $aFields['FIELDS'] = $this->getFields();
        }

        return $aFields;
    }

    public function getFields()
    {
        if (count($this->fields) > 0) {
            return $this->fields;
        }

        require_once 'classes/model/Fields.php';
        $oCriteria = new Criteria('workflow');

        $oCriteria->addSelectColumn(FieldsPeer::FLD_UID);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_INDEX);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_NAME);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_DESCRIPTION);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_TYPE);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_SIZE);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_NULL);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_AUTO_INCREMENT);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_KEY);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_TABLE_INDEX);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_FOREIGN_KEY);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_FOREIGN_KEY_TABLE);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_DYN_NAME);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_DYN_UID);
        $oCriteria->addSelectColumn(FieldsPeer::FLD_FILTER);
        $oCriteria->add(FieldsPeer::ADD_TAB_UID, $this->getAddTabUid());
        $oCriteria->addAscendingOrderByColumn(FieldsPeer::FLD_INDEX);

        $oDataset = FieldsPeer::doSelectRS($oCriteria);
        $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);

        while ($oDataset->next()) {
            $auxField = $oDataset->getRow();
            if ($auxField['FLD_TYPE'] == 'TIMESTAMP') {
                $auxField['FLD_TYPE'] = 'DATETIME';
            }
            $this->fields[] = $auxField;
        }

        return $this->fields;
    }

    public function getPrimaryKeys($type = 'complete')
    {
        $this->primaryKeys = array();
        foreach ($this->fields as $field) {
            if ($field['FLD_KEY'] == '1') {
                if ($type == 'complete') {
                    $this->primaryKeys[] = $field;
                } else {
                    // just field names
                    $this->primaryKeys[] = $field['FLD_NAME'];
                }
            }
        }
        return $this->primaryKeys;
    }

    public function loadByName($name)
    {
        try {
            $oCriteria = new Criteria('workflow');
            $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_UID);
            $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_NAME);
            $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_CLASS_NAME);
            $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_DESCRIPTION);
            //DEPRECATED! $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_SDW_LOG_INSERT);
            // $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_SDW_LOG_UPDATE);
            // $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_SDW_LOG_DELETE);
            // $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_SDW_LOG_SELECT);
            // $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_SDW_MAX_LENGTH);
            // $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_SDW_AUTO_DELETE);
            $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_PLG_UID);
            $oCriteria->addSelectColumn(AdditionalTablesPeer::DBS_UID);
            $oCriteria->addSelectColumn(AdditionalTablesPeer::PRO_UID);
            $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TYPE);
            $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_GRID);
            $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TAG);

            // AdditionalTablesPeer::ADD_TAB_NAME is unique
            $oCriteria->add(AdditionalTablesPeer::ADD_TAB_NAME, $name, Criteria::EQUAL);

            $oDataset = AdditionalTablesPeer::doSelectRS($oCriteria);
            $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);

            $oDataset->next();

            return $oDataset->getRow();
        } catch (Exception $oError) {
            throw($oError);
        }
    }

    /**
     * Create & Update function
     */
    public function create($aData, $aFields = array())
    {
        if (!isset($aData['ADD_TAB_UID']) || (isset($aData['ADD_TAB_UID']) && $aData['ADD_TAB_UID'] == '')) {
            $aData['ADD_TAB_UID'] = G::generateUniqueID();
        }

        $oConnection = Propel::getConnection(AdditionalTablesPeer::DATABASE_NAME);

        try {
            $oAdditionalTables = new AdditionalTables();
            $oAdditionalTables->fromArray($aData, BasePeer::TYPE_FIELDNAME);

            if ($oAdditionalTables->validate()) {
                $oConnection->begin();
                $iResult = $oAdditionalTables->save();
                $oConnection->commit();
                /*                 * **DEPRECATED
                  require_once 'classes/model/ShadowTable.php';
                  $oShadowTable = new ShadowTable();
                  $oShadowTable->create(array('ADD_TAB_UID' => $aData['ADD_TAB_UID'],
                  'SHD_ACTION'  => 'CREATE',
                  'SHD_DETAILS' => serialize($aFields),
                  'USR_UID'     => (isset($_SESSION['USER_LOGGED']) ? $_SESSION['USER_LOGGED'] : ''),
                  'APP_UID'     => '',
                  'SHD_DATE'    => date('Y-m-d H:i:s')));
                 */

                $addTabDescription = ($aData["ADD_TAB_DESCRIPTION"] != "")? ", Description: " . $aData["ADD_TAB_DESCRIPTION"] : ".";
                G::auditLog("CreatePmtable", "PM Table Name: " . $aData['ADD_TAB_NAME'] . $addTabDescription);
                return $aData['ADD_TAB_UID'];
            } else {
                $sMessage = '';
                $aValidationFailures = $oAdditionalTables->getValidationFailures();
                foreach ($aValidationFailures as $oValidationFailure) {
                    $sMessage .= $oValidationFailure->getMessage() . '<br />';
                }
                throw(new Exception('The registry cannot be created!<br />' . $sMessage));
            }
        } catch (Exception $oError) {
            $oConnection->rollback();
            throw($oError);
        }
    }

    public function update($aData, $aFields = array())
    {
        $oConnection = Propel::getConnection(AdditionalTablesPeer::DATABASE_NAME);
        try {
            $oAdditionalTables = AdditionalTablesPeer::retrieveByPK($aData['ADD_TAB_UID']);
            if (!is_null($oAdditionalTables)) {
                $oAdditionalTables->fromArray($aData, BasePeer::TYPE_FIELDNAME);
                if ($oAdditionalTables->validate()) {
                    $oConnection->begin();
                    $iResult = $oAdditionalTables->save();
                    $oConnection->commit();
                    $addTabDescription = (isset($aData["ADD_TAB_DESCRIPTION"]) && $aData["ADD_TAB_DESCRIPTION"] != "") ? ", Description: " . $aData["ADD_TAB_DESCRIPTION"] : ".";
                    G::auditLog("UpdatePmtable", "PM Table Name: " . ( isset($aData['ADD_TAB_NAME']) ? $aData['ADD_TAB_NAME'] : $aData['ADD_TAB_TAG']) . $addTabDescription . ", PM Table ID: (" . $aData['ADD_TAB_UID'] . ") ");
                } else {
                    $sMessage = '';
                    $aValidationFailures = $oAdditionalTables->getValidationFailures();
                    foreach ($aValidationFailures as $oValidationFailure) {
                        $sMessage .= $oValidationFailure->getMessage() . '<br />';
                    }
                    throw(new Exception('The registry cannot be updated!<br />' . $sMessage));
                }
            } else {
                throw(new Exception('This row doesn\'t exist!'));
            }
        } catch (Exception $oError) {
            $oConnection->rollback();
            throw($oError);
        }
    }

    public function remove($sUID)
    {
        $oConnection = Propel::getConnection(AdditionalTablesPeer::DATABASE_NAME);
        try {
            $oAdditionalTables = AdditionalTablesPeer::retrieveByPK($sUID);
            if (!is_null($oAdditionalTables)) {
                $aAdditionalTables = $oAdditionalTables->toArray(BasePeer::TYPE_FIELDNAME);
                $oConnection->begin();
                $iResult = $oAdditionalTables->delete();
                $oConnection->commit();

                return $iResult;
            } else {
                throw(new Exception('This row doesn\'t exist!'));
            }
        } catch (Exception $oError) {
            $oConnection->rollback();
            throw($oError);
        }
    }

    /**
     * verify if Additional Table row specified in [sUID] exists.
     *
     * @param      string $sUID   the uid of the additional table
     */
    public function exists ($sUID)
    {
        $con = Propel::getConnection(AdditionalTablesPeer::DATABASE_NAME);

        try {
            $oPro = AdditionalTablesPeer::retrieveByPk($sUID);
            if (is_object($oPro) && get_class($oPro) == 'AdditionalTables') {
                return true;
            } else {
                return false;
            }
        } catch (Exception $oError) {
            throw ($oError);
        }
    }

    public function deleteAll($id)
    {
        //deleting pm table
        $additionalTable = AdditionalTables::load($id);
        AdditionalTables::remove($id);

        //deleting fields
        require_once 'classes/model/Fields.php';
        $criteria = new Criteria('workflow');
        $criteria->add(FieldsPeer::ADD_TAB_UID, $id);
        FieldsPeer::doDelete($criteria);

        //remove all related to pmTable
        $pmTable = new PmTable($additionalTable['ADD_TAB_NAME']);
        $pmTable->setDataSource($additionalTable['DBS_UID']);
        $pmTable->remove();
    }

    public static function getPHPName($sName)
    {
        $sName = trim($sName);
        $aAux = explode('_', $sName);
        foreach ($aAux as $iKey => $sPart) {
            $aAux[$iKey] = ucwords(strtolower($sPart));
        }
        return implode('', $aAux);
    }

    public function deleteMultiple($arrUID)
    {
        $arrUIDs = explode(",", $arrUID);
        foreach ($arrUIDs as $UID) {
            $this->deleteAll($UID);
        }
    }

    public function getDataCriteria($sUID)
    {
        try {
            $aData = $this->load($sUID, true);
            $sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP;
            $sClassName = ($aData['ADD_TAB_CLASS_NAME'] != ''
                          ? $aData['ADD_TAB_CLASS_NAME']
                          : $this->getPHPName($aData['ADD_TAB_NAME']));

            if (file_exists($sPath . $sClassName . '.php')) {
                require_once $sPath . $sClassName . '.php';
            } else {
                return null;
            }

            $sClassPeerName = $sClassName . 'Peer';
            $con = Propel::getConnection($aData['DBS_UID']);
            $oCriteria = new Criteria($aData['DBS_UID']);

            //eval('$oCriteria->addSelectColumn(' . $sClassPeerName . '::PM_UNIQUE_ID);');
            eval('$oCriteria->addSelectColumn("\'1\' AS DUMMY");');
            foreach ($aData['FIELDS'] as $aField) {
                eval('$oCriteria->addSelectColumn(' . $sClassPeerName . '::' . $aField['FLD_NAME'] . ');');
            }

            switch ($aField['FLD_TYPE']) {
                case 'VARCHAR':
                case 'TEXT':
                case 'DATE':
                    // if($aField['FLD_NULL']!=1)
                    // eval('$oCriteria->add(' . $sClassPeerName . '::' . $aField['FLD_NAME']
                    //. ', \'(�_�_�)\', Criteria::NOT_EQUAL);');
                    break;
                case 'INT';
                case 'FLOAT':
                    eval('$oCriteria->add(' . $sClassPeerName . '::' . $aField['FLD_NAME']
                        .', -99999999999, Criteria::NOT_EQUAL);');
                    break;
            }
            //eval('$oCriteria->addAscendingOrderByColumn(' . $sClassPeerName . '::PM_UNIQUE_ID);');
            //echo $oCriteria->toString();
            return $oCriteria;
        } catch (Exception $oError) {
            throw($oError);
        }
    }

    public function getAllData($sUID, $start = null, $limit = null, $keyOrderUppercase = true, $filter = '', $appUid = false, $search = '')
    {
        $addTab = new AdditionalTables();
        $aData = $addTab->load($sUID, true);
        if (!isset($_SESSION['PROCESS'])) {
            $_SESSION["PROCESS"] = $aData['PRO_UID'];
        }
        $aData['DBS_UID'] = $aData['DBS_UID'] ? $aData['DBS_UID'] : 'workflow';
        $sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP;
        $sClassName = ($aData['ADD_TAB_CLASS_NAME'] != ''
                       ? $aData['ADD_TAB_CLASS_NAME']
                       : $this->getPHPName($aData['ADD_TAB_NAME']));

        if (file_exists($sPath . $sClassName . '.php')) {
            require_once $sPath . $sClassName . '.php';
        } else {
            return null;
        }

        $sClassPeerName = $sClassName . 'Peer';
        $con = Propel::getConnection($aData['DBS_UID']);
        $oCriteria = new Criteria($aData['DBS_UID']);

        //eval('$oCriteria->addSelectColumn("\'1\' AS DUMMY");');

        /*
         * data type:
         * 'INTEGER'  'BIGINT'  'SMALLINT'  'TINYINT'  'DECIMAL'  'DOUBLE'  'FLOAT'  'REAL'
         * 'CHAR'  'VARCHAR'  'LONGVARCHAR'  'BOOLEAN'  'DATE'  'DATETIME'  'TIME'
         */
        $types = array('DECIMAL', 'DOUBLE', 'FLOAT', 'REAL');

        if ($keyOrderUppercase) {
            foreach ($aData['FIELDS'] as $aField) {
                $field = '$oCriteria->addSelectColumn(' . $sClassPeerName . '::' . $aField['FLD_NAME'] . ');';
                if (in_array($aField['FLD_TYPE'], $types)) {
                    $field = '$oCriteria->addAsColumn("' . $aField['FLD_NAME'] . '", "round(" . ' . $sClassPeerName . '::' . $aField['FLD_NAME'] . ' . ", ' . ($aField['FLD_TYPE'] == 'DOUBLE' ? '8' : '2') . ')");';
                }
                eval($field);
                /*if ($aField['FLD_KEY'] == '1') {
                    eval('$oCriteria->addAscendingOrderByColumn('. $sClassPeerName . '::' . $aField['FLD_NAME'] . ');');
                }*/
            }
        }
        $oCriteriaCount = clone $oCriteria;
        //$count = $sClassPeerName::doCount($oCriteria);
        eval('$count = ' . $sClassPeerName . '::doCount($oCriteria);');

        if ($filter != '' && is_string($filter)) {
            $stringOr = '';
            $closure = '';
            $types = array('INTEGER', 'BIGINT', 'SMALLINT', 'TINYINT', 'DECIMAL', 'DOUBLE', 'FLOAT', 'REAL');
            foreach ($aData['FIELDS'] as $aField) {
	            if (($appUid == false && $aField['FLD_NAME'] != 'APP_UID') || ($appUid == true)) {
	                if (in_array($aField['FLD_TYPE'], $types)) {
	                    if (is_numeric($filter)) {
	                        $stringOr = $stringOr . '$a = $oCriteria->getNewCriterion(' . $sClassPeerName . '::' . $aField['FLD_NAME'] . ', "' . $filter . '", Criteria::EQUAL)' . $closure . ';';
	                        $closure = '->addOr($a)';
	                    }
	                } else {
	                    $stringOr = $stringOr . '$a = $oCriteria->getNewCriterion(' . $sClassPeerName . '::' . $aField['FLD_NAME'] . ', "%' . $filter . '%", Criteria::LIKE)' . $closure . ';';
	                    $closure = '->addOr($a)';
	                }
	            }
            }
            $stringOr = $stringOr . '$oCriteria->add($a);';
            eval($stringOr);
        }
        if ($search !== '' && is_string($search)) {
            try {
                $object = G::json_decode($search);
                if (isset($object->where)) {
                    $stringAnd = "";
                    $closure = "";
                    $fields = $object->where;
                    foreach ($fields as $key => $value) {
                        if (is_string($value)) {
                            $stringAnd = $stringAnd . '$a = $oCriteria->getNewCriterion(' . $sClassPeerName . '::' . G::toUpper($key) . ', "' . $value . '", Criteria::EQUAL)' . $closure . ';';
                            $closure = '->addAnd($a)';
                        }
                        if (is_object($value)) {
                            $defined = defined("Base" . $sClassPeerName . "::" . G::toUpper($key));
                            if ($defined === false) {
                                throw new Exception(G::loadTranslation("ID_FIELD_NOT_FOUND") . ": " . $key . "");
                            }
                            if (isset($value->neq) && $defined) {
                                $stringAnd = $stringAnd . '$a = $oCriteria->getNewCriterion(' . $sClassPeerName . '::' . G::toUpper($key) . ', "' . $value->neq . '", Criteria::NOT_EQUAL)' . $closure . ';';
                                $closure = '->addAnd($a)';
                            }
                            if (isset($value->like) && $defined) {
                                $stringAnd = $stringAnd . '$a = $oCriteria->getNewCriterion(' . $sClassPeerName . '::' . G::toUpper($key) . ', "' . $value->like . '", Criteria::LIKE)' . $closure . ';';
                                $closure = '->addAnd($a)';
                            }
                            if (isset($value->nlike) && $defined) {
                                $stringAnd = $stringAnd . '$a = $oCriteria->getNewCriterion(' . $sClassPeerName . '::' . G::toUpper($key) . ', "' . $value->nlike . '", Criteria::NOT_LIKE)' . $closure . ';';
                                $closure = '->addAnd($a)';
                            }
                        }
                    }
                    if (!empty($stringAnd)) {
                        $stringAnd = $stringAnd . '$oCriteria->add($a);';
                        eval($stringAnd);
                    }
                }
            } catch (Exception $oError) {
                throw($oError);
            }
        }
        if ($filter != '' && is_string($filter) || $search !== '' && is_string($search)) {
            $oCriteriaCount = clone $oCriteria;
            eval('$count = ' . $sClassPeerName . '::doCount($oCriteria);');
        }

        $filter = new InputFilter();        
        $sClassPeerName = $filter->validateInput($sClassPeerName);

        if (isset($_POST['sort'])) {
            $_POST['sort'] = $filter->validateInput($_POST['sort']);
            $_POST['dir'] = $filter->validateInput($_POST['dir']);
            if ($_POST['dir'] == 'ASC') {
                if ($keyOrderUppercase) {
                    eval('$oCriteria->addAscendingOrderByColumn("' . $_POST['sort'] . '");');
                } else {
                    eval('$oCriteria->addAscendingOrderByColumn(' . $sClassPeerName . '::' . $_POST['sort'] . ');');
                }
            } else {
                if ($keyOrderUppercase) {
                    eval('$oCriteria->addDescendingOrderByColumn("' . $_POST['sort'] . '");');
                } else {
                    eval('$oCriteria->addDescendingOrderByColumn(' . $sClassPeerName . '::' . $_POST['sort'] . ');');
                }
            }
        }

        if (isset($limit)) {
            $oCriteria->setLimit($limit);
        }
        if (isset($start)) {
            $oCriteria->setOffset($start);
        }
        //$rs = $sClassPeerName::doSelectRS($oCriteria);
        eval('$rs = ' . $sClassPeerName . '::doSelectRS($oCriteria);');
        $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);

        $rows = Array();
        while ($rs->next()) {
            $rows[] = $rs->getRow();
        }

        return array('rows' => $rows, 'count' => $count);
    }

    public function checkClassNotExist($sUID)
    {
        try {
            $aData = $this->load($sUID, true);
            $sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP;
            $sClassName = ($aData['ADD_TAB_CLASS_NAME'] != ''
                          ? $aData['ADD_TAB_CLASS_NAME']
                          : $this->getPHPName($aData['ADD_TAB_NAME']));

            if (file_exists($sPath . $sClassName . '.php')) {
                return $sClassName;
            } else {
                return '';
            }
        } catch (Exception $oError) {
            throw($oError);
        }
    }

    public function saveDataInTable($sUID, $aFields)
    {
        try {
            $aData = $this->load($sUID, true);
            $sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP;
            $sClassName = ($aData['ADD_TAB_CLASS_NAME'] != ''
                          ? $aData['ADD_TAB_CLASS_NAME']
                          : $this->getPHPName($aData['ADD_TAB_NAME']));
            // $oConnection = Propel::getConnection(FieldsPeer::DATABASE_NAME);
            $oConnection = Propel::getConnection($aData['DBS_UID']);
            $stmt = $oConnection->createStatement();
            require_once $sPath . $sClassName . '.php';
            $sKeys = '';
            $keysAutoIncrement = 0;
            $keyUIDAutoIncrement = '';
            foreach ($aData['FIELDS'] as $aField) {
                if ($aField['FLD_KEY'] == 1) {
                    if ($aField['FLD_AUTO_INCREMENT'] == 1) {
                        if ($keysAutoIncrement == 0) {
                            $keyUIDAutoIncrement = $aField['FLD_NAME'];
                        }
                        $keysAutoIncrement++;
                    }
                    $vValue = $aFields[$aField['FLD_NAME']];
                    eval('$' . $aField['FLD_NAME'] . ' = $vValue;');
                    $sKeys .= '$' . $aField['FLD_NAME'] . ',';
                }
            }
            $sKeys = substr($sKeys, 0, -1);
            $oClass = new $sClassName;
            foreach ($aFields as $sKey => $sValue) {
                if (!preg_match("/\(?\)/", $sKey)) {
                    eval('$oClass->set' . $this->getPHPName($sKey) . '($aFields["' . $sKey . '"]);');
                }
            }
            if ($oClass->validate()) {
                $iResult = $oClass->save();
                if ($keysAutoIncrement == 1 && $aFields[$keyUIDAutoIncrement] == '' && isset($_SESSION['APPLICATION']) && $_SESSION['APPLICATION'] != '') {
                    $oCaseKeyAuto = new Cases();
                    $newId = $oClass->getId();
                    $aFields = $oCaseKeyAuto->loadCase($_SESSION['APPLICATION']);
                    $aFields['APP_DATA'][$keyUIDAutoIncrement] = $newId;
                    if (isset($_POST['form'])) {
                        $_POST['form'][$keyUIDAutoIncrement] = $newId;
                    }
                    $oCaseKeyAuto->updateCase($_SESSION['APPLICATION'], $aFields);
                }
            }
            return true;
        } catch (Exception $oError) {
            throw($oError);
        }
    }

    public function getDataTable($sUID, $aKeys)
    {
        try {
            $aData = $this->load($sUID, true);
            $sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP;
            $sClassName = ($aData['ADD_TAB_CLASS_NAME'] != ''
                          ? $aData['ADD_TAB_CLASS_NAME']
                          : $this->getPHPName($aData['ADD_TAB_NAME']));
            require_once $sPath . $sClassName . '.php';
            $sKeys = '';
            foreach ($aKeys as $sName => $vValue) {
                eval('$' . $sName . ' = $vValue;');
                $sKeys .= '$' . $sName . ',';
            }
            $sKeys = substr($sKeys, 0, -1);
            eval('$oClass = ' . $sClassName . 'Peer::retrieveByPK(' . $sKeys . ');');
            //eval('$oClass = ' . $sClassName . 'Peer::retrieveByPK($sPMUID);');
            if (!is_null($oClass)) {
                return $oClass->toArray(BasePeer::TYPE_FIELDNAME);
            } else {
                return false;
            }
        } catch (Exception $oError) {
            throw($oError);
        }
    }

    public function updateDataInTable($sUID, $aFields)
    {
        try {
            //$sPMUID = $aFields['PM_UNIQUE_ID'];
            $aData = $this->load($sUID, true);
            $sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP;
            $sClassName = ($aData['ADD_TAB_CLASS_NAME'] != ''
                          ? $aData['ADD_TAB_CLASS_NAME']
                          : $this->getPHPName($aData['ADD_TAB_NAME']));
            $oConnection = Propel::getConnection(FieldsPeer::DATABASE_NAME);
            require_once $sPath . $sClassName . '.php';
            $sKeys = '';
            foreach ($aData['FIELDS'] as $aField) {
                if ($aField['FLD_KEY'] == 1) {
                    $vValue = $aFields[$aField['FLD_NAME']];
                    eval('$' . $aField['FLD_NAME'] . ' = $vValue;');
                    $sKeys .= '$' . $aField['FLD_NAME'] . ',';
                }
            }
            $sKeys = substr($sKeys, 0, -1);
            eval('$oClass = ' . $sClassName . 'Peer::retrieveByPK(' . $sKeys . ');');
            //eval('$oClass = ' . $sClassName . 'Peer::retrieveByPK($sPMUID);');
            if (!is_null($oClass)) {
                $oClass->fromArray($aFields, BasePeer::TYPE_FIELDNAME);
                if ($oClass->validate()) {
                    $oConnection->begin();
                    $iResult = $oClass->save();
                    $oConnection->commit();
                    return $iResult;
                }
            } else {
                $sMessage = '';
                if ($oClass) {
                    $aValidationFailures = $oClass->getValidationFailures();
                    foreach ($aValidationFailures as $oValidationFailure) {
                        $sMessage .= $oValidationFailure->getMessage() . '<br />';
                    }
                } else {
                    $sMessage = 'Error, row cannot updated';
                    return false;
                }
                throw(new Exception('The registry cannot be updated!<br />' . $sMessage));
            }
        } catch (Exception $oError) {
            throw($oError);
        }
    }

    public function deleteDataInTable($sUID, $aKeys)
    {
        try {
            $aData = $this->load($sUID, true);
            $sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP;
            $sClassName = ($aData['ADD_TAB_CLASS_NAME'] != ''
                          ? $aData['ADD_TAB_CLASS_NAME']
                          : $this->getPHPName($aData['ADD_TAB_NAME']));
            $oConnection = Propel::getConnection(FieldsPeer::DATABASE_NAME);
            require_once $sPath . $sClassName . '.php';
            $sKeys = '';
            foreach ($aKeys as $sName => $vValue) {
                eval('$' . $sName . ' = $vValue;');
                $sKeys .= '$' . $sName . ',';
            }
            $sKeys = substr($sKeys, 0, -1);
            eval('$oClass = ' . $sClassName . 'Peer::retrieveByPK(' . $sKeys . ');');
            //eval('$oClass = ' . $sClassName . 'Peer::retrieveByPK($sPMUID);');
            if (!is_null($oClass)) {
                if ($oClass->validate()) {
                    $oConnection->begin();
                    $iResult = $oClass->delete();
                    $oConnection->commit();
                    return $iResult;
                }
            } else {
                $sMessage = '';
                $aValidationFailures = $oConnection-- > getValidationFailures();
                foreach ($aValidationFailures as $oValidationFailure) {
                    $sMessage .= $oValidationFailure->getMessage() . '<br />';
                }
                throw(new Exception('The registry cannot be updated!<br />' . $sMessage));
            }
        } catch (Exception $oError) {
            throw($oError);
        }
    }

    /**
     * Populate the report table with all case data
     * @param string $sType
     * @param string $sProcessUid
     * @param string $sGrid
     * @return number
     */
    public function populateReportTable($tableName, $sConnection = 'rp', $type = 'NORMAL', $processUid = '', $gridKey = '', $addTabUid = '')
    {
        require_once "classes/model/Application.php";

        $this->className = $this->getPHPName($tableName);
        $this->classPeerName = $this->className . 'Peer';

        if (!file_exists(PATH_WORKSPACE . 'classes/' . $this->className . '.php')) {
            throw new Exception( "ERROR: " . PATH_WORKSPACE . 'classes/' . $this->className . '.php'
                                . " class file doesn't exit!");
        }

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

        while ($dataset->next()) {
            $row = $dataset->getRow();
            //remove old applications references
            $deleteSql = "DELETE FROM $tableName WHERE APP_UID = '" . $row['APP_UID'] . "'";
            $rs = $stmt->executeQuery($deleteSql);
            // getting the case data
            $caseData = unserialize($row['APP_DATA']);

            $fieldTypes = array();

            if ($addTabUid != '') {
                require_once 'classes/model/Fields.php';
                $criteriaField = new Criteria('workflow');
                $criteriaField->add(FieldsPeer::ADD_TAB_UID, $addTabUid);
                $datasetField = FieldsPeer::doSelectRS($criteriaField);
                $datasetField->setFetchmode(ResultSet::FETCHMODE_ASSOC);
                while ($datasetField->next()) {
                    $rowfield = $datasetField->getRow();
                    switch ($rowfield['FLD_TYPE']) {
                        case 'FLOAT':
                        case 'DOUBLE':
                        case 'INTEGER':
                            $fieldTypes[] = array($rowfield['FLD_NAME']=>$rowfield['FLD_TYPE']);
                            break;
                        default:
                            break;
                    }
                }
            }

            // quick fix
            // map all empty values as NULL for Database
            foreach ($caseData as $dKey => $dValue) {
                if (is_array($dValue) && count($dValue)) {
                    $j = key($dValue);
                    $dValue = (is_array($dValue[$j])) ? $dValue : $dValue[$j];
                }
                if (!is_array($dValue)) {
                    foreach ($fieldTypes as $key => $fieldType) {
                        foreach ($fieldType as $name => $theType) {
                            if (strtoupper($dKey) == $name) {
                                $caseData[$dKey] = validateType ($dValue, $theType);
                                unset($name);
                            }
                        }
                    }
                    // normal fields
                    if (trim($dValue) === '') {
                        $caseData[$dKey] = null;
                    }
                } else {
                    // grids
                    foreach ($caseData[$dKey] as $dIndex => $dRow) {
                        if (is_array($dRow)) {
                            foreach ($dRow as $k => $v) {
                                if (trim($v) === '') {
                                    $caseData[$dKey][$dIndex][$k] = null;
                                }
                            }
                        }
                    }
                }
            }

            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']);
                    if (method_exists($obj, 'setAppStatus')) {
                        $obj->setAppStatus($row['APP_STATUS']);
                    }
                    $obj->fromArray(array_change_key_case($gridRow, CASE_UPPER), BasePeer::TYPE_FIELDNAME);
                    $obj->setRow($i);
                    $obj->save();
                    eval('$obj = new ' . $this->className . '();');
                }
            } else {
                eval('$obj = new ' . $this->className . '();');
                $obj->fromArray(array_change_key_case($caseData, CASE_UPPER), BasePeer::TYPE_FIELDNAME);
                $obj->setAppUid($row['APP_UID']);
                $obj->setAppNumber($row['APP_NUMBER']);
                if (method_exists($obj, 'setAppStatus')) {
                    $obj->setAppStatus($row['APP_STATUS']);
                }
                $obj->save();
                $obj = null;
            }
        }
    }

    /**
     * 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, $appStatus)
    {
        //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);');

            //Select all types
            require_once 'classes/model/Fields.php';
            $criteriaField = new Criteria('workflow');
            $criteriaField->add(FieldsPeer::ADD_TAB_UID, $row['ADD_TAB_UID']);
            $datasetField = FieldsPeer::doSelectRS($criteriaField);
            $datasetField->setFetchmode(ResultSet::FETCHMODE_ASSOC);
            $fieldTypes = array();
            while ($datasetField->next()) {
                $rowfield = $datasetField->getRow();
                switch ($rowfield['FLD_TYPE']) {
                    case 'FLOAT':
                    case 'DOUBLE':
                    case 'INTEGER':
                        $fieldTypes[] = array($rowfield['FLD_NAME']=>$rowfield['FLD_TYPE']);
                        break;
                    default:
                        break;
                }
            }

            switch ($row['ADD_TAB_TYPE']) {
                //switching by report table type
                case 'NORMAL':
                    // parsing empty values to null
                    if (!is_array($caseData)) {
                        $caseData = unserialize($caseData);
                    }
                    foreach ($caseData as $i => $v) {
                        if (is_array($v) && count($v)) {
                            $j = key($v);
                            $v = (is_array($v[$j])) ? $v : $v[$j];
                        }
                        foreach ($fieldTypes as $key => $fieldType) {
                            foreach ($fieldType as $name => $type) {
                                if ( strtoupper ( $i) == $name) {
                                    $v = validateType ($v, $type);
                                    unset($name);
                                }
                            }
                        }
                        $caseData[$i] = $v === '' ? null : $v;
                    }

                    if (is_array($records) && count($records) > 0) {
                        // if the record already exists on the report table
                        foreach ($records as $record) {
                            //update all records
                            if (method_exists($record, 'setAppStatus')) {
                                $record->setAppStatus($appStatus);
                            }
                            $record->fromArray(array_change_key_case($caseData, CASE_UPPER), BasePeer::TYPE_FIELDNAME);
                            if ($record->validate()) {
                                $record->save();
                            }
                        }
                    } else {
                        // there are not any record for this application on the table, then create it
                        eval('$obj = new ' . $className . '();');
                        $obj->fromArray(array_change_key_case($caseData, CASE_UPPER), BasePeer::TYPE_FIELDNAME);
                        $obj->setAppUid($appUid);
                        $obj->setAppNumber($appNumber);
                        if (method_exists($obj, 'setAppStatus')) {
                            $obj->setAppStatus($appStatus);
                        }
                        $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();
                        }
                    }
                    // save all grid rows on grid type report table
                    foreach ($gridData as $i => $gridRow) {
                        eval('$obj = new ' . $className . '();');
                        //Parsing values
                        foreach ($gridRow as $j => $v) {
                            foreach ($fieldTypes as $key => $fieldType) {
                                foreach ($fieldType as $name => $type) {
                                    if ( strtoupper ( $j) == $name) {
                                        $v = validateType ($v, $type);
                                        unset($name);
                                    }
                                }
                            }
                            $gridRow[$j] = $v === '' ? null : $v;
                        }
                        $obj->fromArray(array_change_key_case($gridRow, CASE_UPPER), BasePeer::TYPE_FIELDNAME);
                        $obj->setAppUid($appUid);
                        $obj->setAppNumber($appNumber);
                        if (method_exists($obj, 'setAppStatus')) {
                            $obj->setAppStatus($appStatus);
                        }
                        $obj->setRow($i);
                        $obj->save();
                    }
                    break;
            }
        }
    }

    public function getTableVars($uid, $bWhitType = false)
    {
        require_once 'classes/model/Fields.php';
        try {
            $oCriteria = new Criteria('workflow');
            $oCriteria->addSelectColumn(FieldsPeer::ADD_TAB_UID);
            $oCriteria->addSelectColumn(FieldsPeer::FLD_NAME);
            $oCriteria->addSelectColumn(FieldsPeer::FLD_TYPE);
            $oCriteria->addSelectColumn(FieldsPeer::FLD_DYN_NAME);
            $oCriteria->add(FieldsPeer::ADD_TAB_UID, $uid);
            $oDataset = ReportVarPeer::doSelectRS($oCriteria);
            $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
            $oDataset->next();
            $aVars = array();
            $aImportedVars = array(); //This array will help to control if the variable already exist
            while ($aRow = $oDataset->getRow()) {
                if ($bWhitType) {
                    if (!in_array($aRow['FLD_NAME'], $aImportedVars)) {
                        $aImportedVars[] = $aRow['FLD_NAME'];
                        $aVars[] = array('sFieldName'    => $aRow['FLD_NAME'],
                                         'sFieldDynName' => $aRow['FLD_DYN_NAME'],
                                         'sType'         => $aRow['FLD_TYPE']);
                    }
                } else {
                    $aVars[] = $aRow['FLD_NAME'];
                }
                $oDataset->next();
            }
            return $aVars;
        } catch (Exception $oError) {
            throw($oError);
        }
    }

    /**
     * @param $proUid
     * @return array
     */
    public function getReportTables($proUid)
    {
        $reportTables = array();
        $oCriteria = new Criteria('workflow');
        $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_UID);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_NAME);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_DESCRIPTION);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TYPE);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TAG);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::PRO_UID);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::DBS_UID);
        $oCriteria->add(AdditionalTablesPeer::PRO_UID, $proUid, Criteria::EQUAL);
        $dt = ContentPeer::doSelectRS($oCriteria);
        $dt->setFetchmode(ResultSet::FETCHMODE_ASSOC);
        while ($dt->next()) {
            $row = $dt->getRow();
            array_push($reportTables, $row);
        }
        return $reportTables;
    }
    
    public function getAll($start = 0, $limit = 20, $filter = '', $process = null)
    {
        $oCriteria = new Criteria('workflow');
        $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_UID);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_NAME);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_DESCRIPTION);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TYPE);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TAG);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::PRO_UID);
        $oCriteria->addSelectColumn(AdditionalTablesPeer::DBS_UID);

        if (isset($process)) {
            foreach ($process as $key => $pro_uid) {
                if ($key == 'equal') {
                    $oCriteria->add(AdditionalTablesPeer::PRO_UID, $pro_uid, Criteria::EQUAL);
                } else {
                    $oCriteria->add(AdditionalTablesPeer::PRO_UID, $pro_uid, Criteria::NOT_EQUAL);
                }
            }
        }

        if ($filter != '' && is_string($filter)) {
            $oCriteria->add(
            $oCriteria->getNewCriterion(AdditionalTablesPeer::ADD_TAB_NAME, '%' . $filter . '%', Criteria::LIKE)->addOr(
            $oCriteria->getNewCriterion(AdditionalTablesPeer::ADD_TAB_DESCRIPTION, '%' . $filter . '%', Criteria::LIKE))
            );
        }

        if (isset($_POST['sort'])) {
            if ($_POST['dir'] == 'ASC') {
                eval('$oCriteria->addAscendingOrderByColumn(AdditionalTablesPeer::' . $_POST['sort'] . ');');
            } else {
                eval('$oCriteria->addDescendingOrderByColumn(AdditionalTablesPeer::' . $_POST['sort'] . ');');
            }
        } else {
            $oCriteria->addAscendingOrderByColumn(AdditionalTablesPeer::ADD_TAB_NAME);
        }

        $criteriaCount = clone $oCriteria;
        $count = AdditionalTablesPeer::doCount($criteriaCount);

        $oCriteria->setLimit($limit);
        $oCriteria->setOffset($start);

        $oDataset = AdditionalTablesPeer::doSelectRS($oCriteria);
        $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);

        $addTables = Array();
        $proUids = Array();

        while ($oDataset->next()) {
            $row = $oDataset->getRow();
            $row['PRO_TITLE'] = $row['PRO_DESCRIPTION'] = '';
            $addTables[] = $row;
            if ($row['PRO_UID'] != '') {
                $proUids[] = $row['PRO_UID'];
            }
        }

        //process details will have the info about the processes
        $procDetails = Array();

        if (count($proUids) > 0) {
            //now get the labels for all process, using an array of Uids,
            $c = new Criteria('workflow');
            //$c->add ( ContentPeer::CON_CATEGORY, 'PRO_TITLE', Criteria::EQUAL );
            $c->add(ProcessPeer::PRO_UID, $proUids, Criteria::IN);
            $dt = ProcessPeer::doSelectRS($c);
            $dt->setFetchmode(ResultSet::FETCHMODE_ASSOC);

            while ($dt->next()) {
                $row = $dt->getRow();
                $procDetails[$row['PRO_UID']]['PRO_TITLE'] = $row['PRO_TITLE'];
                $procDetails[$row['PRO_UID']]['PRO_DESCRIPTION'] = $row['PRO_DESCRIPTION'];
            }

            foreach ($addTables as $i => $addTable) {
                if (isset($procDetails[$addTable['PRO_UID']]['PRO_TITLE'])) {
                    $addTables[$i]['PRO_TITLE'] = $procDetails[$addTable['PRO_UID']]['PRO_TITLE'];
                }

                if (isset($procDetails[$addTable['PRO_UID']]['PRO_DESCRIPTION'])) {
                    $addTables[$i]['PRO_DESCRIPTION'] = $procDetails[$addTable['PRO_UID']]['PRO_DESCRIPTION'];
                }
            }
        }

        return array('rows' => $addTables, 'count' => $count);
    }

    /**
     * DEPRECATED createPropelClasses()
     *
     * Don't use this method, it was left only for backward compatibility
     * for some external plugins that still is using it
     */
    public function createPropelClasses($sTableName, $sClassName, $aFields, $sAddTabUid, $connection = 'workflow')
    {
        try {
            /* $aUID = array('FLD_NAME'           => 'PM_UNIQUE_ID',
              'FLD_TYPE'           => 'INT',
              'FLD_KEY'            => 'on',
              'FLD_SIZE'           => '11',
              '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'])
                                    : ($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);
        }
    }
}

