Esempio n. 1
0
 public static function psctrl(array $params)
 {
     $id = array_get_value_unset('id', $params);
     $class = to_array(array_get_value_unset('class', $params));
     $class[] = 'pscontrols';
     if (!empty($params)) {
         array_remove_keys($params, array_diff(array_keys($params), PsUtil::getClassConsts(__CLASS__, 'ACTION_')));
     }
     return empty($params) ? '' : PSSmarty::template('common/pscontrols.tpl', array('id' => $id, 'class' => PsHtml::classes2string($class), 'actions' => $params))->fetch();
 }
Esempio n. 2
0
 /**
  * @constructor
  *
  * Instantiate steps from Work model.
  */
 public function __construct($data = null)
 {
     if ($data instanceof Work) {
         $this->work($data);
         // note; Take the value copy of parent Work model.
         $data = $data->data();
         array_remove_keys($data, array('uuid', 'tasks', 'timestamp'));
         $data = array_filter($data);
     }
     parent::__construct($data);
 }
Esempio n. 3
0
/**
 * Removes the specified keys from the array.
 *
 * @param array $array
 * @param array $keys Keys to remove
 *
 * @return array
 *
 * @author Jack P.
 * @package Avalon
 * @subpackage Helpers
 */
function array_remove_keys($array, $keys)
{
    // Loop over the array
    foreach ($array as $key => $value) {
        // Check if we want to remove it...
        if (!is_numeric($key) and in_array($key, $keys)) {
            unset($array[$key]);
            continue;
        }

        // Filter the value if it's an array also
        $array[$key] = is_array($value) ? array_remove_keys($value, $keys) : $value;
    }

    return $array;
}
Esempio n. 4
0
/**
 * Returns the json encoded version of the passed data.
 *
 * @param mixed $data
 * @param array $options
 *
 * @author Jack P.
 * @copyright Copyright (c) Jack P.
 * @package Traq
 * @subpackage Helpers
 */
function to_json($data, $options = array())
{
    // Merge options with defaults
    $defaults = array('hide' => array('password', 'login_hash', 'api_key', 'private_key'));
    $options = array_merge($defaults, $options);
    // Convert the data to an array, if possible..
    if (!is_array($data)) {
        $data = to_array($data);
    }
    foreach ($data as $k => $v) {
        $data[$k] = to_array($v);
    }
    // Remove the parts we don't want...
    if (isset($options['hide']) and is_array($data)) {
        $data = array_remove_keys($data, $options['hide']);
    }
    return json_encode($data);
}
Esempio n. 5
0
 public function groupByMethod(&$tables, $tableName, $isReplace, $upFile, $showChanges, $targetdb, $sourcedb)
 {
     $fields = "";
     $pKeys = "";
     $IDs = "";
     $selFields = "";
     // check columns exist in both tables
     $columns = array_intersect_key($tables[0][$tableName]->getColumns(), $tables[1][$tableName]->getColumns());
     // count identity,primary and other columns
     $colCnt = array("ID" => 0, "PK" => 0, "CL" => 0, "TOT" => 0);
     foreach ($columns as $column) {
         if ($column->metadata['IDENTITY']) {
             $IDs .= ($colCnt["ID"] > 0 ? "," : "") . fixFieldName($column->name, true, true);
             ++$colCnt["ID"];
         } else {
             if ($column->metadata['PRIMARY']) {
                 $pKeys .= ($colCnt["PK"] > 0 ? "," : "") . fixFieldName($column->name, true, true);
                 ++$colCnt["PK"];
             } else {
                 $fields .= ($colCnt["CL"] > 0 ? "," : "") . fixFieldName($column->name, true, true);
                 ++$colCnt["CL"];
             }
         }
         $selFields .= ($colCnt["TOT"] > 0 ? "," : "") . fixFieldName($column->name, true, true);
         ++$colCnt["TOT"];
     }
     // to convert in zend syntax for other db compatibility
     $sql = "SELECT MIN(tbl_name) AS tbl_name, " . $selFields . "\r\n                FROM\r\n                 (\r\n                  SELECT 'source_table' AS tbl_name , " . $selFields . "\r\n                  FROM " . $targetdb->name . "." . $tableName . " AS S\r\n                  UNION ALL\r\n                  SELECT 'target_table' AS tbl_name , " . $selFields . "\r\n                  FROM " . $sourcedb->name . "." . $tableName . " AS D\r\n                )  AS alias_table\r\n                 GROUP BY " . $selFields . "\r\n                 HAVING COUNT(*)=1";
     // to optimize
     if ($IDs != "" || $pKeys != "") {
         $sql .= " ORDER BY ";
         if ($IDs != "" && $pKeys != "") {
             $sql .= $IDs . "," . $pKeys;
         } else {
             if ($IDs != "") {
                 $sql .= $IDs;
             } else {
                 $sql .= $pKeys;
             }
         }
     }
     $result = mysql_query($sql, $this->targetdb->getMysqlConnection());
     if (!$result) {
         return false;
     }
     // clean tables
     $tables[0][$tableName]->blankRows();
     $tables[1][$tableName]->blankRows();
     $pColumns = $tables[0][$tableName]->getPrimaryColumns();
     $keycnt = count($pColumns);
     $canCompare = !empty($pColumns) && is_array($pColumns);
     $pKeyData = array();
     $Data = array();
     $num_rows = mysql_num_rows($result);
     // <= to process again after latest row fetch
     if ($num_rows > 0) {
         for ($i = 0; $i <= $num_rows; $i++) {
             $row = mysql_fetch_array($result, MYSQL_ASSOC);
             $DataOld = $Data;
             // data (array) - compared (boolean)
             $Data[0] = $row;
             $Data[1] = false;
             if ($canCompare) {
                 $pKeyDataOld = $pKeyData;
                 unset($pKeyData);
                 //reset
                 foreach ($pColumns as $pkName) {
                     $pKeyData[] = $row[$pkName];
                 }
             }
             //hack code, to optimize ?
             //comparing with old value, it is possible with "order by"
             if ($canCompare && $pKeyDataOld == $pKeyData) {
                 if ($Data[0]['tbl_name'] == $DataOld[0]['tbl_name']) {
                     continue;
                     // can't happen
                 }
                 if ($Data[0]['tbl_name'] == 'source_table') {
                     $values = array_remove_keys($Data[0], 'tbl_name');
                     $compare = array_remove_keys($DataOld[0], 'tbl_name');
                 } else {
                     $values = array_remove_keys($DataOld[0], 'tbl_name');
                     $compare = array_remove_keys($Data[0], 'tbl_name');
                 }
                 $cRow = $tables[0][$tableName]->createRow($values, $tables[0][$tableName]->getRowsArray());
                 //create query using target data
                 $this->rowsSetDiff($cRow, "compare", $compare, $isReplace);
                 // in create query we get the compare value from source row
                 $upFile->createQuery($cRow, $pColumns, $keycnt, $tableName);
                 if ($showChanges) {
                     $tables[0][$tableName]->addRow($cRow);
                 }
                 // compared
                 $DataOld[1] = true;
                 $Data[1] = true;
             } else {
                 if ($i > 0 && $DataOld[1] == false) {
                     if ($DataOld[0]['tbl_name'] == "source_table") {
                         $cRow = $tables[0][$tableName]->createRow(array_remove_keys($DataOld[0], 'tbl_name'), $tables[0][$tableName]->getRowsArray());
                         $this->rowsSetDiff($cRow, "missing");
                         $upFile->createQuery($cRow, $pColumns, $keycnt, $tableName);
                         if ($showChanges) {
                             $tables[0][$tableName]->addRow($cRow);
                         }
                     } else {
                         if ($DataOld[0]['tbl_name'] == "target_table") {
                             $cRow = $tables[1][$tableName]->createRow(array_remove_keys($DataOld[0], 'tbl_name'), $tables[1][$tableName]->getRowsArray());
                             $this->rowsSetDiff($cRow, "new");
                             $upFile->createQuery($cRow, $pColumns, $keycnt, $tableName);
                             if ($showChanges) {
                                 $tables[1][$tableName]->addRow($cRow);
                             }
                         }
                     }
                 }
             }
         }
         $upFile->writeData($keycnt, $tableName);
     }
 }
Esempio n. 6
0
function executeProcess(array $argv)
{
    PsConnectionPool::assertDisconnectied();
    /*
     * СОЗДАЁМ SQL
     * 
     * Нам нужны настройки таблиц, которые неоткуда взять, кроме как из базы, поэтому для экспорта данных нужна БД.
     * Все данные из "редактируемых" таблиц также загружаются из этой БД.
     */
    $DB = DirManager::inst(__DIR__ . '/temp');
    $SDK = DirManager::inst(__DIR__ . '/temp/sdk');
    //Почистим файлы для удаления
    dolog('Clearing not .sql/.txt from temp dir');
    /* @var $item DirItem */
    foreach ($DB->getDirContentFull(null, DirItemFilter::FILES) as $item) {
        if (!$item->checkExtension(array(PsConst::EXT_TXT, PsConst::EXT_SQL))) {
            dolog('[-] {}', $item->remove()->getRelPath());
        }
    }
    dolog();
    /*
     * SDK
     */
    //dolog('Processing objects.sql');
    /* @var $DIR DirManager */
    foreach (array(ENTITY_SCOPE_SDK => $SDK, ENTITY_SCOPE_PROJ => $DB) as $scope => $DM) {
        dolog();
        dolog('***************************************************************');
        dolog('>>> Processing scope [{}], dir: [{}]', $scope, $DM->absDirPath());
        $SCHEMA = $DM->getDirItem(null, 'schema.sql');
        if (!$SCHEMA->isFile()) {
            dolog('schema.sql is not exists, skipping');
            continue;
            //---
        }
        $DM_SYSOBJECTS = DirManager::inst($DM->absDirPath(), 'sysobjects');
        /*
         * Очищаем папку, в которой будет содержимое для автосгенерированных файлов
         */
        $DM_AUTO = DirManager::inst($DM_SYSOBJECTS->absDirPath(), 'auto')->clearDir();
        /*
         * Создадим ссылку на файл с данными, выгруженными из таблиц
         */
        $DI_AUTO_DATA = $DM_AUTO->getDirItem(null, 'data.sql');
        /*
         * Сначала сделаем триггеры на таблицы, от которых зависит кеш и к которым привязаны фолдинги.
         */
        LOGBOX_INIT();
        LOGBOX('Making cache and folding table triggers');
        $DM_AUTO_TRIGGERS = $DM_AUTO->getDirItem('triggers')->makePath();
        $DI_AUTO_TRIGGERS_SQL = $DM_AUTO->getDirItem(null, 'triggers', 'sql')->getSqlFileBuilder();
        $triggerPattern = $SDK->getDirItem('sysobjects/patterns', 'ta_iud_pattern.sql')->getFileContents();
        //BUILDIAN AND ADDING TRIGGERS
        foreach (PsTriggersAware::getTriggeredTables($scope) as $table) {
            foreach (PsTriggersAware::getActions() as $action) {
                $actions = PsTriggersAware::getTriggerActions($table, $scope, $action);
                if (empty($actions)) {
                    continue;
                    //---
                }
                $name = 'ta' . strtolower(first_char($action)) . '_' . $table;
                $trigger = str_replace('<%NAME%>', $name, $triggerPattern);
                $trigger = str_replace('<%TABLE%>', $table, $trigger);
                $trigger = str_replace('<%ACTION%>', $action, $trigger);
                $trigger = str_replace('<%CALL%>', implode("\n", $actions), $trigger);
                dolog("+ {$name}");
                foreach ($actions as $_action) {
                    dolog($_action);
                }
                $DI_AUTO_TRIGGERS_SQL->appendFile($DM_AUTO_TRIGGERS->getDirItem(null, $name, 'sql')->putToFile($trigger));
            }
        }
        //Все автоматически сгенерированные триггеры положим в отдельный файл
        $DI_AUTO_TRIGGERS_SQL->save();
        $autoTriggers = DirManager::inst($DM_AUTO_TRIGGERS->getAbsPath())->getDirContent(null, PsConst::EXT_SQL);
        dolog('Triggers made: {}', count($autoTriggers));
        /*
         * objects.sql
         */
        $OBJECTS_SQL = $DM_AUTO->getDirItem(null, 'objects.sql')->getSqlFileBuilder();
        /*
         * Добавляем автосгенерированные триггеры
         */
        LOGBOX('Processing objects.sql');
        if (empty($autoTriggers)) {
            dolog('No auto triggers');
        } else {
            dolog('Adding {} auto triggers', count($autoTriggers));
            $OBJECTS_SQL->appendMlComment('AUTO TRIGGERS SECTION');
            /* @var $triggerDi DirItem */
            foreach ($autoTriggers as $triggerDi) {
                dolog('+ {}', $triggerDi->getName());
                $OBJECTS_SQL->appendFile($triggerDi);
            }
        }
        /*
         * Получаем строки с включениями
         */
        $ALL = $DM_SYSOBJECTS->getDirItem(null, 'all.txt')->getFileLines(false);
        if (empty($ALL)) {
            dolog('No includes');
        } else {
            dolog('Adding {} includes from all.txt', count($ALL));
            $OBJECTS_SQL->appendMlComment('INCLUDES SECTION');
            foreach ($ALL as $include) {
                dolog('+ {}', $include);
                $OBJECTS_SQL->appendFile($DM_SYSOBJECTS->getDirItem($include));
            }
        }
        $OBJECTS_SQL->save();
        /*
         * Создаём скрипты инициализации для схем
         */
        foreach (PsConnectionParams::getDefaultConnectionNames() as $connection) {
            if (PsConnectionParams::has($connection, $scope)) {
                $props = PsConnectionParams::get($connection, $scope);
                $database = $props->database();
                if (empty($database)) {
                    continue;
                    //Не задана БД - пропускаем (для root)
                }
                LOGBOX('Making schema script for {}', $props);
                $SCHEMA_SQL = $DM_AUTO->getDirItem('schemas', $database, 'sql')->makePath()->getSqlFileBuilder();
                //DROP+USE
                $SCHEMA_SQL->clean();
                $SCHEMA_SQL->appendLine("DROP DATABASE IF EXISTS {$database};");
                $SCHEMA_SQL->appendLine("CREATE DATABASE {$database} CHARACTER SET utf8 COLLATE utf8_general_ci;");
                $SCHEMA_SQL->appendLine("USE {$database};");
                if ($scope == ENTITY_SCOPE_PROJ) {
                    dolog('+ SDK PART');
                    //Добавим секцию в лог
                    $SCHEMA_SQL->appendMlComment('>>> SDK');
                    //CREATE CHEMA SCRIPT
                    $SCHEMA_SQL->appendFile($SDK->getDirItem(null, 'schema.sql'));
                    //OBJECTS SCRIPT
                    $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/auto', 'objects.sql'));
                    //Добавим секцию в лог
                    $SCHEMA_SQL->appendMlComment('<<< SDK');
                }
                //CREATE CHEMA SCRIPT
                $SCHEMA_SQL->appendFile($SCHEMA);
                //OBJECTS SCRIPT
                $SCHEMA_SQL->appendFile($OBJECTS_SQL->getDi());
                //CREATE USER
                $grant = "grant all on {}.* to '{}'@'{}' identified by '{}';";
                $SCHEMA_SQL->appendMlComment('Grants');
                $SCHEMA_SQL->appendLine(PsStrings::replaceWithBraced($grant, $database, $props->user(), $props->host(), $props->password()));
                /*
                 * Мы должны создать тестовую схему, чтобы убедиться, что всё хорошо и сконфигурировать db.ini
                 */
                if ($connection == PsConnectionParams::CONN_TEST) {
                    dolog('Making physical schema {}', $props);
                    $rootProps = PsConnectionParams::get(PsConnectionParams::CONN_ROOT);
                    dolog('Root connection props: {}', $rootProps);
                    $rootProps->execureShell($SCHEMA_SQL->getDi());
                    dolog('Connecting to [{}]', $props);
                    PsConnectionPool::configure($props);
                    $tables = PsTable::all();
                    /*
                     * Нам нужно определить новый список таблиц SDK, чтобы по ним 
                     * провести валидацию новых db.ini.
                     * 
                     * Если мы обрабатываем проект, то SDK-шный db.ini уже готов и 
                     * можем положиться на него. Если мы подготавливаем SDK-шный db.ini,
                     * но новый список таблиц возмём из развёрнутой тестовой БД.
                     */
                    $sdkTableNames = $scope == ENTITY_SCOPE_SDK ? array_keys($tables) : DbIni::getSdkTables();
                    if ($scope == ENTITY_SCOPE_PROJ) {
                        //Уберём из всех таблиц - SDK`шные
                        array_remove_keys($tables, $sdkTableNames);
                    }
                    $scopeTableNames = array_keys($tables);
                    sort($scopeTableNames);
                    /*
                     * Составим список таблиц.
                     * Он нам особенно не нужен, но всёже будем его формировать для наглядности - какие таблицы добавились.
                     */
                    $tablesDi = $DM_AUTO->getDirItem(null, 'tables.txt')->putToFile(implode("\n", $scopeTableNames));
                    dolog('Tables: {} saved to {}', print_r($scopeTableNames, true), $tablesDi->getAbsPath());
                    /*
                     * Загружаем полный список таблиц схемы и на основе имеющихся db.ini файлов строим новые, добавляя/удаляя 
                     * таблицы, добавленные/удалённые из схемы.
                     */
                    $dbIniProps = PsDbIniHelper::makeDbIniForSchema($scope, $tables);
                    dolog('db.ini props: {}', print_r($dbIniProps, true));
                    $dbIniErrors = PsDbIniHelper::validateAndSaveDbIniTableProps($scope, $dbIniProps, $sdkTableNames);
                    if ($dbIniErrors) {
                        PsUtil::raise('db.ini errors for {}: {}', $scope, print_r($dbIniErrors, true));
                    }
                    /*
                     * Для проекта выгружаем данные, хранящиеся в файлах
                     */
                    if ($scope == ENTITY_SCOPE_PROJ) {
                        dolog('Exporting tables data from files');
                        $DM_AUTO->getDirItem('data')->makePath();
                        $AUTO_DATA_SQL = $DI_AUTO_DATA->touch()->getSqlFileBuilder();
                        //Пробегаемся по таблицам
                        foreach (DbIni::getTables() as $tableName) {
                            $table = PsTable::inst($tableName);
                            if ($table->isFilesync()) {
                                $fileData = $table->exportFileAsInsertsSql();
                                if ($fileData) {
                                    dolog(' + {}', $tableName);
                                    $AUTO_DATA_SQL->appendFile($DM_AUTO->getDirItem('data', $tableName, 'sql')->putToFile($fileData));
                                } else {
                                    dolog(' - {}', $tableName);
                                }
                            }
                        }
                        $AUTO_DATA_SQL->save();
                        /*
                         * Вставим данные в тестовую схему
                         */
                        dolog('Inserting data to test schema.');
                        $props->execureShell($DI_AUTO_DATA);
                    }
                    /*
                     * Теперь ещё создадим тестовые объекты.
                     * Мы уверены, что для SDK тестовая часть есть всегда.
                     */
                    $TEST_SCHEMA_SQL = $DM_AUTO->getDirItem('test', 'schema', 'sql')->makePath()->getSqlFileBuilder();
                    if ($scope == ENTITY_SCOPE_PROJ) {
                        dolog('+ SDK TEST PART');
                        //Добавим секцию в лог
                        $TEST_SCHEMA_SQL->appendMlComment('>>> SDK');
                        //CREATE CHEMA SCRIPT
                        $TEST_SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/auto/test', 'schema.sql'));
                        //Добавим секцию в лог
                        $TEST_SCHEMA_SQL->appendMlComment('<<< SDK');
                    }
                    $TEST_SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'schema.sql'), false);
                    $TEST_SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'data.sql'), false);
                    $TEST_SCHEMA_SQL->save();
                    /*
                     * На тестовой схеме прогоняем скрипты с тестовыми данными
                     */
                    dolog('Making test schema objects.');
                    $props->execureShell($TEST_SCHEMA_SQL->getDi());
                }
                #end conn== TEST
                /*
                 * Если были сгенерированы данные из файлов - добавляем их
                 */
                if ($DI_AUTO_DATA->isFile() && $DI_AUTO_DATA->getSize() > 0) {
                    dolog('Append data inserts to {}', $SCHEMA_SQL->getDi()->getName());
                    $SCHEMA_SQL->appendFile($DI_AUTO_DATA);
                }
                //SAVE .sql
                $SCHEMA_SQL->save();
            }
        }
    }
    dolog('Database schemas successfully exported');
}
 function Show($oView = '')
 {
     global $dcl_info, $g_oSec, $g_oSession;
     commonHeader();
     if (!$g_oSec->HasPerm(DCL_ENTITY_WORKORDER, DCL_PERM_SEARCH)) {
         return PrintPermissionDenied();
     }
     $bView = is_object($oView);
     $aProtectedFields = array('notes', 'dcl_hotlist.hotlist_tag', 'is_public', 'timecards.actionby', 'timecards.summary');
     $objJS = CreateObject('dcl.jsAttributesets');
     $objJS->bModules = true;
     $objJS->bStatusTypes = true;
     $objJS->bDepartments = !$g_oSec->IsPublicUser();
     $objJS->DisplayAttributeScript();
     $objPersonnel = CreateObject('dcl.htmlPersonnel');
     $objDepartment = CreateObject('dcl.htmlDepartments');
     $objProducts = CreateObject('dcl.htmlProducts');
     $objPriorities = CreateObject('dcl.htmlPriorities');
     $objSeverities = CreateObject('dcl.htmlSeverities');
     $objStatuses = CreateObject('dcl.htmlStatuses');
     $objProjects = CreateObject('dcl.htmlProjects');
     $objModules = CreateObject('dcl.htmlProductModules');
     $objType = CreateObject('dcl.htmlWorkOrderType');
     $oDBP = CreateObject('dcl.dbPersonnel');
     $oDBP->Load($GLOBALS['DCLID']);
     $t =& CreateSmarty();
     if ($bView) {
         $t->assign('VAL_REPORTTITLE', $oView->title);
     } else {
         $t->assign('VAL_REPORTTITLE', '');
     }
     $t->assign('VAL_DEPARTMENT', $oDBP->department);
     $t->assign('VAL_ID', $GLOBALS['DCLID']);
     $aDefault = array();
     $aDefault['product'] = array();
     $aDefault['priority'] = array();
     $aDefault['severity'] = array();
     $aDefault['dcl_wo_account.account_id'] = array();
     $aDefault['status'] = array();
     $aDefault['project'] = array();
     $aDefault['wo_type_id'] = array();
     $aDefault['statuses.dcl_status_type'] = array();
     $aDefault['department'] = array();
     $aDefault['personnel'] = array();
     $aDefault['is_public'] = array();
     $aDefault['entity_source_id'] = array();
     $aDefault['module_id'] = array();
     $sPersonnelKey = '';
     $sStatusKey = '';
     $sModuleKey = '';
     if ($bView) {
         foreach ($oView->filter as $field => $values) {
             if (substr($field, 1) == '.department') {
                 if ($field[0] == 'a') {
                     $t->assign('CHK_RESPONSIBLE', ' checked');
                 } else {
                     if ($field[0] == 'b') {
                         $t->assign('CHK_CREATEBY', ' checked');
                     } else {
                         if ($field[0] == 'c') {
                             $t->assign('CHK_CLOSEDBY', ' checked');
                         }
                     }
                 }
                 $field = 'department';
                 $sPersonnelKey = '';
             } else {
                 if ($field == 'responsible' || $field == 'createby' || $field == 'closedby') {
                     $t->assign('CHK_' . strtoupper($field), ' checked');
                     $field = 'personnel';
                     $sPersonnelKey = '';
                 } else {
                     if ($field == 'account') {
                         $field = 'dcl_wo_account.account_id';
                     } else {
                         if ($field == 'dcl_projects.projectid') {
                             $field = 'project';
                         }
                     }
                 }
             }
             if (array_key_exists($field, $aDefault)) {
                 $aDefault[$field] = $values;
             }
         }
         if (isset($aDefault['personnel']) && is_array($aDefault['personnel']) && count($aDefault['personnel']) > 0) {
             $sPersonnel = implode(',', $aDefault['personnel']);
             $oDBP->Query("select department, id from personnel where id in ({$sPersonnel})");
             while ($oDBP->next_record()) {
                 if (!in_array($oDBP->f(0), $aDefault['department'])) {
                     $aDefault['department'][] = $oDBP->f(0);
                 }
                 if ($sPersonnelKey != '') {
                     $sPersonnelKey .= ':';
                 }
                 $sPersonnelKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1));
             }
         }
         if (isset($aDefault['status']) && is_array($aDefault['status']) && count($aDefault['status']) > 0) {
             $sStatus = implode(',', $aDefault['status']);
             $oDBP->Query("select dcl_status_type, id from statuses where id in ({$sStatus})");
             while ($oDBP->next_record()) {
                 if (!in_array($oDBP->f(0), $aDefault['statuses.dcl_status_type'])) {
                     $aDefault['statuses.dcl_status_type'][] = $oDBP->f(0);
                 }
                 if ($sStatusKey != '') {
                     $sStatusKey .= ':';
                 }
                 $sStatusKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1));
             }
         }
         if (isset($aDefault['module_id']) && is_array($aDefault['module_id']) && count($aDefault['module_id']) > 0) {
             $sModule = implode(',', $aDefault['module_id']);
             $oDBP->Query("select product_id, product_module_id from dcl_product_module where product_module_id in ({$sModule})");
             while ($oDBP->next_record()) {
                 if (!in_array($oDBP->f(0), $aDefault['product'])) {
                     $aDefault['product'][] = $oDBP->f(0);
                 }
                 if ($sModuleKey != '') {
                     $sModuleKey .= ':';
                 }
                 $sModuleKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1));
             }
         }
     } else {
         $aDefault['product'] = 0;
         $aDefault['priority'] = 0;
         $aDefault['severity'] = 0;
         $aDefault['dcl_wo_account.account_id'] = 0;
         $aDefault['status'] = 0;
         $aDefault['project'] = 0;
         $aDefault['wo_type_id'] = 0;
         $aDefault['entity_source_id'] = 0;
         $aDefault['is_public'] = 0;
         $aDefault['statuses.dcl_status_type'] = 1;
         $aDefault['department'] = array($oDBP->department);
         $aDefault['personnel'] = $GLOBALS['DCLID'];
         $sPersonnelKey = sprintf('%d,%d', $oDBP->department, $GLOBALS['DCLID']);
         $sStatusKey = '';
         $sModuleKey = '';
         if ($GLOBALS['g_oSec']->HasPerm(DCL_ENTITY_WORKORDER, DCL_PERM_ACTION)) {
             $t->assign('CHK_RESPONSIBLE', ' checked');
             $t->assign('CHK_CREATEBY', '');
             $t->assign('CHK_CLOSEDBY', '');
         } else {
             $t->assign('CHK_CREATEBY', ' checked');
             $t->assign('CHK_RESPONSIBLE', '');
             $t->assign('CHK_CLOSEDBY', '');
         }
     }
     $t->assign('VAL_DEPARTMENTS', $aDefault['department']);
     $t->assign('VAL_PERSONNEL', $aDefault['personnel']);
     $t->assign('VAL_WO_TYPE', $aDefault['wo_type_id']);
     $t->assign('VAL_PRODUCT', $aDefault['product']);
     $t->assign('VAL_MODULE', $aDefault['module_id']);
     $t->assign('VAL_PRIORITY', $aDefault['priority']);
     $t->assign('VAL_SEVERITY', $aDefault['severity']);
     $t->assign('VAL_SELECTPERSONNELKEY', $sPersonnelKey);
     $t->assign('VAL_SELECTSTATUSKEY', $sStatusKey);
     $t->assign('VAL_SELECTMODULEKEY', $sModuleKey);
     $t->assign('CMB_STATUSES', $objStatuses->GetCombo($aDefault['status'], 'status', 'name', 8));
     $t->assign('IS_PUBLIC', $g_oSec->IsPublicUser());
     if (!$g_oSec->IsPublicUser()) {
         $t->assign('CMB_PROJECTS', $objProjects->GetCombo($aDefault['project'], 'project', 'name', 8));
         $t->assign('CMB_PUBLIC', GetYesNoCombo($aDefault['is_public'], 'is_public', 2, false));
     }
     $oSelect =& CreateObject('dcl.htmlSelect');
     if ($g_oSec->IsOrgUser()) {
         $oSelect->SetOptionsFromDb('dcl_org', 'org_id', 'name', 'org_id IN (' . $g_oSession->Value('member_of_orgs') . ')', 'name');
     } else {
         $oSelect->SetOptionsFromDb('dcl_org', 'org_id', 'name', '', 'name');
     }
     $oSelect->iSize = 8;
     $oSelect->vDefault = $aDefault['dcl_wo_account.account_id'];
     $oSelect->sName = 'account';
     $t->assign('CMB_ACCOUNTS', $oSelect->GetHTML());
     $oSource = CreateObject('dcl.htmlEntitySource');
     $t->assign('CMB_SOURCE', $oSource->GetCombo($aDefault['entity_source_id'], 'entity_source_id', 8, false));
     // Empty status is for selecting status type, then filtering status if desired
     $oSelect->sName = 'status';
     $oSelect->iSize = 8;
     $t->assign('CMB_STATUSESEMPTY', $oSelect->GetHTML());
     // Status Types
     $oSelect->sName = 'dcl_status_type';
     $oSelect->iSize = 8;
     $oSelect->vDefault = $aDefault['statuses.dcl_status_type'];
     $oSelect->SetOptionsFromDb('dcl_status_type', 'dcl_status_type_id', 'dcl_status_type_name', '', 'dcl_status_type_id');
     $t->assign('CMB_STATUSTYPES', $oSelect->GetHTML());
     $t->assign('CHK_SUMMARY', '');
     $t->assign('CHK_NOTES', '');
     $t->assign('CHK_DESCRIPTION', '');
     $t->assign('VAL_SEARCHTEXT', '');
     if ($bView && count($oView->filterlike) > 0) {
         $searchText = '';
         foreach ($oView->filterlike as $field => $values) {
             if ($field == 'summary' || $field == 'notes' || $field == 'description') {
                 $t->assign('CHK_' . strtoupper($field), ' CHECKED');
                 $searchText = $values[0];
             }
         }
         $t->assign('VAL_SEARCHTEXT', $searchText);
     }
     if (isset($oView->filter['dcl_tag.tag_desc']) && is_array($oView->filter['dcl_tag.tag_desc']) && count($oView->filter['dcl_tag.tag_desc']) > 0) {
         $t->assign('VAL_TAGS', join(',', $oView->filter['dcl_tag.tag_desc']));
     }
     if (isset($oView->filter['dcl_hotlist.hotlist_tag']) && is_array($oView->filter['dcl_hotlist.hotlist_tag']) && count($oView->filter['dcl_hotlist.hotlist_tag']) > 0) {
         $t->assign('VAL_HOTLISTS', join(',', $oView->filter['dcl_hotlist.hotlist_tag']));
     }
     $aDateChecks = array('createdon', 'closedon', 'statuson', 'lastactionon', 'deadlineon', 'eststarton', 'estendon', 'starton');
     for ($i = 0; $i < count($aDateChecks); $i++) {
         $t->assign('CHK_' . strtoupper($aDateChecks[$i]), '');
     }
     if ($bView) {
         $t->assign('VAL_DATEFROM', '');
         $t->assign('VAL_DATETO', '');
         if (count($oView->filterdate) > 0) {
             $fromDate = '';
             $toDate = '';
             foreach ($oView->filterdate as $field => $values) {
                 $t->assign('CHK_' . strtoupper($field), ' CHECKED');
                 $fromDate = $values[0];
                 $toDate = $values[1];
             }
             $t->assign('VAL_DATEFROM', $fromDate);
             $t->assign('VAL_DATETO', $toDate);
         }
     } else {
         $aFewDaysAgo = mktime(0, 0, 0, date('m'), date('d') - 3, date('Y'));
         $t->assign('VAL_DATEFROM', date($dcl_info['DCL_DATE_FORMAT'], $aFewDaysAgo));
         $t->assign('VAL_DATETO', date($dcl_info['DCL_DATE_FORMAT']));
     }
     $aCols = array('jcn' => STR_WO_JCN, 'seq' => STR_WO_SEQ, 'dcl_wo_type.type_name' => STR_WO_TYPE, 'responsible.short' => STR_WO_RESPONSIBLE, 'products.name' => STR_WO_PRODUCT, 'statuses.name' => STR_WO_STATUS, 'summary' => STR_WO_SUMMARY, 'dcl_product_module.module_name' => STR_CMMN_MODULE, 'dcl_projects.name' => STR_WO_PROJECT, 'dcl_org.name' => STR_WO_ACCOUNT, 'count(*):dcl_org' => '# ' . STR_WO_ACCOUNT, 'dcl_tag.tag_desc' => STR_CMMN_TAGS, 'dcl_hotlist.hotlist_tag' => 'Hotlists', 'createby.short' => STR_WO_OPENBY, 'createdon' => STR_WO_OPENEDON, 'closedby.short' => STR_WO_CLOSEBY, 'closedon' => STR_WO_CLOSEDON, 'statuson' => STR_WO_STATUSON, 'lastactionon' => STR_WO_LASTACTION, 'deadlineon' => STR_WO_DEADLINE, 'eststarton' => STR_WO_ESTSTART, 'estendon' => STR_WO_ESTEND, 'starton' => STR_WO_START, 'esthours' => STR_WO_ESTHOURS, 'etchours' => STR_WO_ETCHOURS, 'totalhours' => STR_WO_ACTHOURS, 'priorities.name' => STR_WO_PRIORITY, 'severities.name' => STR_WO_SEVERITY, 'reported_version_id.product_version_text' => STR_WO_REVISION, 'targeted_version_id.product_version_text' => 'Target Version', 'fixed_version_id.product_version_text' => 'Fixed Version', 'dcl_contact.last_name' => 'Contact Last Name', 'dcl_contact.first_name' => 'Contact First Name', 'dcl_contact_phone.phone_number' => STR_WO_CONTACTPHONE, 'notes' => STR_WO_NOTES, 'description' => STR_WO_DESCRIPTION, 'dcl_status_type.dcl_status_type_name' => STR_CMMN_STATUSTYPE, 'dcl_entity_source.entity_source_name' => STR_CMMN_SOURCE, 'is_public' => STR_CMMN_PUBLIC, 'actionby.short' => 'Last Time Card By', 'timecards.summary' => 'Last Time Card Summary');
     if ($g_oSec->IsPublicUser()) {
         foreach ($aProtectedFields as $sField) {
             unset($aCols[$sField]);
         }
     }
     if ($bView) {
         $aShow = array();
         $aGroup = array();
         foreach ($oView->columns as $colName) {
             if ($colName == 'a.short') {
                 $colName = 'responsible.short';
             } else {
                 if ($colName == 'b.short') {
                     $colName = 'closedby.short';
                 } else {
                     if ($colName == 'c.short') {
                         $colName = 'createby.short';
                     } else {
                         if ($colName == 'g.short') {
                             $colName = 'actionby.short';
                         }
                     }
                 }
             }
             $aShow[$colName] = $aCols[$colName];
         }
         foreach ($oView->groups as $colName) {
             if ($colName == 'a.short') {
                 $colName = 'responsible.short';
             } else {
                 if ($colName == 'b.short') {
                     $colName = 'closedby.short';
                 } else {
                     if ($colName == 'c.short') {
                         $colName = 'createby.short';
                     } else {
                         if ($colName == 'g.short') {
                             $colName = 'actionby.short';
                         }
                     }
                 }
             }
             $aGroup[$colName] = $aCols[$colName];
         }
         if ($g_oSec->IsPublicUser()) {
             foreach ($aProtectedFields as $sField) {
                 if (isset($aShow[$sField])) {
                     unset($aShow[$sField]);
                 }
                 if (isset($aGroup[$sField])) {
                     unset($aGroup[$sField]);
                 }
             }
         }
     } else {
         $aShow = array('jcn' => STR_WO_JCN, 'seq' => STR_WO_SEQ, 'dcl_wo_type.type_name' => STR_WO_TYPE, 'responsible.short' => STR_WO_RESPONSIBLE, 'products.name' => STR_WO_PRODUCT, 'statuses.name' => STR_WO_STATUS, 'summary' => STR_WO_SUMMARY);
         $aGroup = array();
     }
     array_remove_keys($aCols, $aShow);
     array_remove_keys($aCols, $aGroup);
     $t->assign('VAL_COLS', $aCols);
     $t->assign('VAL_SHOW', $aShow);
     $t->assign('VAL_GROUP', $aGroup);
     if ($bView) {
         $aOrder = array();
         foreach ($oView->order as $val) {
             if ($val == 'priorities.weight') {
                 $sText = isset($aShow['priorities.name']) ? $aShow['priorities.name'] : $aCols['priorities.name'];
             } else {
                 if ($val == 'severities.weight') {
                     $sText = isset($aShow['severities.name']) ? $aShow['severities.name'] : $aCols['severities.name'];
                 } else {
                     if (isset($aShow[$val])) {
                         $sText = $aShow[$val];
                     } else {
                         if (isset($aCols[$val])) {
                             $sText = $aCols[$val];
                         }
                     }
                 }
             }
             array_push($aOrder, array($val => $sText));
         }
         $t->assign('VAL_SORT');
     }
     SmartyDisplay($t, 'htmlWorkOrderSearch.tpl');
 }
Esempio n. 8
0
/**
 * Процесс строит скрипты разворачивания БД
 * 
 * @param array $argv
 */
function executeProcess(array $argv)
{
    /*
     * СОЗДАЁМ SQL
     * 
     * Нам нужны настройки таблиц, которые неоткуда взять, кроме как из базы, поэтому для экспорта данных нужна БД.
     */
    $DB = DirManager::inst(__DIR__ . '/temp');
    $SDK = DirManager::inst(__DIR__ . '/temp/ps-sdk');
    //Почистим файлы, которые нам не интересны
    $cleanExt = array(PsConst::EXT_TXT, PsConst::EXT_SQL);
    dolog('Clearing not {} files from temp dir', array_to_string($cleanExt));
    /* @var $item DirItem */
    foreach ($DB->getDirContentFull(null, DirItemFilter::FILES) as $item) {
        if (!$item->checkExtension($cleanExt)) {
            dolog('[-] {}', $item->remove()->getRelPath());
        }
    }
    //Пробежимся по скоупам и выполним обработку
    /* @var $DIR DirManager */
    foreach (array(ENTITY_SCOPE_SDK => $SDK, ENTITY_SCOPE_PROJ => $DB) as $scope => $DM) {
        dolog();
        dolog('***************************** SCOPE [{}] *****************************', $scope);
        dolog('Working directory: [{}]', $DM->absDirPath());
        $SCHEMA = $DM->getDirItem(null, 'schema', PsConst::EXT_SQL);
        if (!$SCHEMA->isFile()) {
            dolog('schema.sql is not exists, skipping');
            continue;
            //---
        }
        //Директория с системными объектами
        $DM_SYSOBJECTS = DirManager::inst($DM->absDirPath(), 'sysobjects');
        //Директория, в которой будет содержимое для автосгенерированных файлов
        $DM_BUILD = DirManager::inst($DM->absDirPath(), 'build')->clearDir();
        //Создадим ссылку на файл с объектами
        $DM_BUILD_ALL_SQL = $DM_BUILD->getDirItem(null, 'all', PsConst::EXT_SQL)->getSqlFileBuilder();
        //Строим objects.sql
        dolog('Processing all.sql');
        /*
         * Получаем строки с включениями в objects.sql
         */
        $ALL_LINES = $DM_SYSOBJECTS->getDirItem(null, 'all', PsConst::EXT_TXT)->getFileLines(false);
        if (empty($ALL_LINES)) {
            dolog('No includes');
        } else {
            dolog('Adding {} includes from all.txt', count($ALL_LINES));
            foreach ($ALL_LINES as $include) {
                dolog('+ {}', $include);
                $DM_BUILD_ALL_SQL->appendFile($DM_SYSOBJECTS->getDirItem($include));
            }
        }
        // << Сохраняем objects.sql
        $DM_BUILD_ALL_SQL->save();
        /*
         * Создаём скрипты инициализации для схем
         */
        dolog('Processing default connection names: {}', array_to_string(array_values(PsConnectionParams::getDefaultConnectionNames())));
        foreach (PsConnectionParams::getDefaultConnectionNames() as $connection) {
            //На момент обработки скоупа мы не должны быть подключены никуда
            PsConnectionPool::assertDisconnectied();
            //Для данного скоупа не задан коннект? Пропускаем...
            if (PsConnectionParams::CONN_ROOT == $connection) {
                dolog('Skip {}', $connection);
                continue;
                //---
            }
            if (!PsConnectionParams::has($connection, $scope)) {
                dolog('No connection properties for {}', $connection);
                continue;
                //---
            }
            //Поработаем с настройками
            $props = PsConnectionParams::get($connection, $scope);
            $database = $props->database();
            if (empty($database)) {
                continue;
                //Не задана БД - пропускаем (для root)
            }
            dolog('Making schema script for {}', $props);
            $SCHEMA_DI = $DM_BUILD->getDirItem('schemas', $database, PsConst::EXT_SQL)->makePath();
            check_condition(!$SCHEMA_DI->isFile(), 'Schema file for database "{}" is already exists. Dublicate database names?', $database);
            $SCHEMA_SQL = $SCHEMA_DI->getSqlFileBuilder();
            //DROP+USE
            $SCHEMA_SQL->clean();
            $SCHEMA_SQL->appendLine("DROP DATABASE IF EXISTS {$database};");
            $SCHEMA_SQL->appendLine("CREATE DATABASE {$database} CHARACTER SET utf8 COLLATE utf8_general_ci;");
            $SCHEMA_SQL->appendLine("USE {$database};");
            //CREATE USER
            $grant = "grant all on {}.* to '{}'@'{}' identified by '{}';";
            $SCHEMA_SQL->appendMlComment('Create user with grants');
            $SCHEMA_SQL->appendLine(PsStrings::replaceWithBraced($grant, $database, $props->user(), $props->host(), $props->password()));
            if ($scope == ENTITY_SCOPE_PROJ) {
                dolog('+ SDK PART');
                //Добавим секцию в лог
                $SCHEMA_SQL->appendMlComment('>>> SDK');
                //CREATE CHEMA SCRIPT
                $SCHEMA_SQL->appendFile($SDK->getDirItem(null, 'schema', PsConst::EXT_SQL));
                //OBJECTS SCRIPT
                $SCHEMA_SQL->appendFile($SDK->getDirItem('build', 'all', PsConst::EXT_SQL));
                //Добавим секцию в лог
                $SCHEMA_SQL->appendMlComment('<<< SDK');
            }
            //CREATE CHEMA SCRIPT
            $SCHEMA_SQL->appendFile($SCHEMA);
            //OBJECTS SCRIPT
            $SCHEMA_SQL->appendFile($DM_BUILD_ALL_SQL->getDi());
            /*
             * Мы должны создать тестовую схему, чтобы убедиться, что всё хорошо и сконфигурировать db.ini
             */
            if ($connection != PsConnectionParams::CONN_TEST) {
                //Всё, сохраняем скрипт, работа закончена
                $SCHEMA_SQL->save();
                continue;
                //---
            }
            /*
             * На тестовой схеме прогоняем скрипт
             */
            dolog('Making physical schema {}', $props);
            $rootProps = PsConnectionParams::get(PsConnectionParams::CONN_ROOT);
            dolog('Root connection props: {}', $rootProps);
            $rootProps->execureShell($SCHEMA_SQL->getDi());
            dolog('Connecting to [{}]', $props);
            PsConnectionPool::configure($props);
            $tables = PsTable::all();
            /*
             * Нам нужно определить новый список таблиц SDK, чтобы по ним 
             * провести валидацию новых db.ini.
             * 
             * Если мы обрабатываем проект, то SDK-шный db.ini уже готов и 
             * можем положиться на него. Если мы подготавливаем SDK-шный db.ini,
             * но новый список таблиц возмём из развёрнутой тестовой БД.
             */
            $sdkTableNames = $scope == ENTITY_SCOPE_SDK ? array_keys($tables) : $SDK->getDirItem('build', 'tables', PsConst::EXT_TXT)->getFileLines();
            if ($scope == ENTITY_SCOPE_PROJ) {
                //Уберём из всех таблиц - SDK`шные
                array_remove_keys($tables, $sdkTableNames);
            }
            $scopeTableNames = array_keys($tables);
            sort($scopeTableNames);
            /*
             * Составим список таблиц.
             * Он нам особенно не нужен, но всёже будем его формировать для наглядности - какие таблицы добавились.
             */
            $TABLES_DI = $DM_BUILD->getDirItem(null, 'tables', PsConst::EXT_TXT)->touch()->putToFile(implode("\n", $scopeTableNames));
            dolog('Tables saved to {}: {}', $TABLES_DI->getRelPath(), print_r($scopeTableNames, true));
            /*
             * Выгрузим данные из таблиц в файл, чтобы убедиться, что всё корректно вставилось.
             */
            if ($scopeTableNames) {
                dolog("Exporting '{}' schema tables data to file", $database);
                $DATA_DI_SQL = $DM_BUILD->getDirItem(null, 'data', PsConst::EXT_SQL)->getSqlFileBuilder();
                $DATA_DI_SQL->clean();
                //Пробегаемся по таблицам
                foreach ($scopeTableNames as $tableName) {
                    $fileData = PsTable::inst($tableName)->exportAsSqlString();
                    if ($fileData) {
                        dolog(' + {} [not empty]', $tableName);
                        $DATA_DI_SQL->appendMlComment('+ table ' . $tableName);
                        $DATA_DI_SQL->appendLine($fileData);
                    } else {
                        dolog(' - {} [empty]', $tableName);
                    }
                }
                $DATA_DI_SQL->save();
            }
            /*
             * Теперь ещё создадим тестовые объекты.
             * Для каждого скоупа свои тестовые данные, так что таблицы можно называть одинаково.
             */
            dolog('Add test part');
            $SCHEMA_SQL->appendMlComment('Test part');
            /*
             if ($scope == ENTITY_SCOPE_PROJ) {
             dolog('+ SDK TEST PART');
            
             //Добавим секцию в лог
             $SCHEMA_SQL->appendMlComment('>>> SDK TEST PART');
            
             //CREATE CHEMA SCRIPT
             $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/test', 'schema', PsConst::EXT_SQL));
            
             //ADD TEST DATA
             $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/test', 'data', PsConst::EXT_SQL));
            
             //Добавим секцию в лог
             $SCHEMA_SQL->appendMlComment('<<< SDK TEST PART');
             }
            */
            $SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'schema', PsConst::EXT_SQL), false);
            $SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'data', PsConst::EXT_SQL), false);
            $SCHEMA_SQL->save();
            #end conn== TEST
            /*
             * Всё, сохраняем финальный скрипт
             */
            //SAVE .sql
            $SCHEMA_SQL->save();
            //Переразвернём тестовую схему с тестовыми таблицами
            dolog("Rebuilding checma '{}'", $database);
            $rootProps->execureShell($SCHEMA_SQL->getDi());
            //Отключимся от схемы
            PsConnectionPool::disconnect();
        }
    }
    dolog('Database schemas successfully exported');
}
 function Show($oView = '')
 {
     global $dcl_info, $g_oSec, $g_oSession;
     commonHeader();
     $bView = is_object($oView);
     $objJS =& CreateObject('dcl.jsAttributesets');
     $objJS->bModules = true;
     $objJS->bStatusTypes = true;
     $objJS->bDepartments = !$g_oSec->IsPublicUser();
     $objJS->DisplayAttributeScript();
     $oSelect =& CreateObject('dcl.htmlSelect');
     $objPersonnel =& CreateObject('dcl.htmlPersonnel');
     $objProducts =& CreateObject('dcl.htmlProducts');
     $objPriorities =& CreateObject('dcl.htmlPriorities');
     $objSeverities =& CreateObject('dcl.htmlSeverities');
     $objStatuses =& CreateObject('dcl.htmlStatuses');
     $objDepartment =& CreateObject('dcl.htmlDepartments');
     $objModules =& CreateObject('dcl.htmlProductModules');
     $oDBP =& CreateObject('dcl.dbPersonnel');
     $oDBP->Load($GLOBALS['DCLID']);
     $t =& CreateSmarty();
     if ($bView) {
         $t->assign('VAL_REPORTTITLE', $oView->title);
     } else {
         $t->assign('VAL_REPORTTITLE', '');
     }
     $t->assign('VAL_DEPARTMENT', $oDBP->department);
     $t->assign('VAL_ID', $GLOBALS['DCLID']);
     $aDefault = array();
     $aDefault['product'] = array();
     $aDefault['module_id'] = array();
     $aDefault['priority'] = array();
     $aDefault['type'] = array();
     $aDefault['account'] = array();
     $aDefault['status'] = array();
     $aDefault['statuses.dcl_status_type'] = array();
     $aDefault['department'] = array();
     $aDefault['personnel'] = array();
     $aDefault['entity_source_id'] = array();
     $aDefault['is_public'] = array();
     $sPersonnelKey = '';
     $sStatusKey = '';
     $sModuleKey = '';
     if ($bView) {
         reset($oView->filter);
         while (list($field, $values) = each($oView->filter)) {
             if (substr($field, 1) == '.department') {
                 if ($field[0] == 'a') {
                     $t->assign('CHK_RESPONSIBLE', ' checked');
                 } else {
                     if ($field[0] == 'b') {
                         $t->assign('CHK_CREATEDBY', ' checked');
                     } else {
                         if ($field[0] == 'c') {
                             $t->assign('CHK_CLOSEDBY', ' checked');
                         }
                     }
                 }
                 $field = 'department';
                 $sPersonnelKey = '';
             } else {
                 if ($field == 'responsible' || $field == 'createdby' || $field == 'closedby') {
                     $t->assign('CHK_' . strtoupper($field), ' checked');
                     $field = 'personnel';
                     $sPersonnelKey = '';
                 }
             }
             if (array_key_exists($field, $aDefault)) {
                 $aDefault[$field] = $values;
             }
         }
         if (is_array($aDefault['personnel']) && count($aDefault['personnel']) > 0) {
             $sPersonnel = implode(',', $aDefault['personnel']);
             $oDBP->Query("select department, id from personnel where id in ({$sPersonnel})");
             while ($oDBP->next_record()) {
                 if (!in_array($oDBP->f(0), $aDefault['department'])) {
                     $aDefault['department'][] = $oDBP->f(0);
                 }
                 if ($sPersonnelKey != '') {
                     $sPersonnelKey .= ':';
                 }
                 $sPersonnelKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1));
             }
         }
         if (is_array($aDefault['status']) && count($aDefault['status']) > 0) {
             $sStatus = implode(',', $aDefault['status']);
             $oDBP->Query("select dcl_status_type, id from statuses where id in ({$sStatus})");
             while ($oDBP->next_record()) {
                 if (!in_array($oDBP->f(0), $aDefault['statuses.dcl_status_type'])) {
                     $aDefault['statuses.dcl_status_type'][] = $oDBP->f(0);
                 }
                 if ($sStatusKey != '') {
                     $sStatusKey .= ':';
                 }
                 $sStatusKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1));
             }
         }
         if (is_array($aDefault['module_id']) && count($aDefault['module_id']) > 0) {
             $sModule = implode(',', $aDefault['module_id']);
             $oDBP->Query("select product_id, product_module_id from dcl_product_module where product_module_id in ({$sModule})");
             while ($oDBP->next_record()) {
                 if (!in_array($oDBP->f(0), $aDefault['product'])) {
                     $aDefault['product'][] = $oDBP->f(0);
                 }
                 if ($sModuleKey != '') {
                     $sModuleKey .= ':';
                 }
                 $sModuleKey .= sprintf('%d,%d', $oDBP->f(0), $oDBP->f(1));
             }
         }
     } else {
         $aDefault['product'] = 0;
         $aDefault['priority'] = 0;
         $aDefault['type'] = 0;
         $aDefault['account'] = 0;
         $aDefault['status'] = 0;
         $aDefault['project'] = 0;
         $aDefault['entity_source_id'] = 0;
         $aDefault['statuses.dcl_status_type'] = 1;
         $aDefault['department'] = array($oDBP->department);
         $aDefault['personnel'] = $GLOBALS['DCLID'];
         $aDefault['is_public'] = '';
         $sPersonnelKey = sprintf('%d,%d', $oDBP->department, $GLOBALS['DCLID']);
         $sStatusKey = '';
         $sModuleKey = '';
         if ($g_oSec->HasPerm(DCL_ENTITY_TICKET, DCL_PERM_ACTION)) {
             $t->assign('CHK_RESPONSIBLE', ' checked');
             $t->assign('CHK_CREATEBY', '');
             $t->assign('CHK_CLOSEDBY', '');
         } else {
             $t->assign('CHK_CREATEBY', ' checked');
             $t->assign('CHK_RESPONSIBLE', '');
             $t->assign('CHK_CLOSEDBY', '');
         }
     }
     $t->assign('VAL_DEPARTMENTS', $aDefault['department']);
     $t->assign('VAL_PERSONNEL', $aDefault['personnel']);
     $t->assign('VAL_PRODUCT', $aDefault['product']);
     $t->assign('VAL_MODULE', $aDefault['module_id']);
     $t->assign('VAL_PRIORITY', $aDefault['priority']);
     $t->assign('VAL_TYPE', $aDefault['type']);
     $t->assign('VAL_SELECTPERSONNELKEY', $sPersonnelKey);
     $t->assign('VAL_SELECTSTATUSKEY', $sStatusKey);
     $t->assign('VAL_SELECTMODULEKEY', $sModuleKey);
     $t->assign('CMB_STATUS', $objStatuses->GetCombo($aDefault['status'], 'status', 'name', 8));
     $t->assign('IS_PUBLIC', $g_oSec->IsPublicUser());
     if (!$g_oSec->IsPublicUser()) {
         $t->assign('CMB_PUBLIC', GetYesNoCombo($aDefault['is_public'], 'is_public', 3));
     }
     if ($g_oSec->IsOrgUser()) {
         $oSelect->SetOptionsFromDb('dcl_org', 'org_id', 'name', 'org_id IN (' . $g_oSession->Value('member_of_orgs') . ')', 'name');
     } else {
         $oSelect->SetOptionsFromDb('dcl_org', 'org_id', 'name', '', 'name');
     }
     $oSelect->iSize = 8;
     $oSelect->vDefault = $aDefault['account'];
     $oSelect->sName = 'account';
     $t->assign('CMB_ACCOUNTS', $oSelect->GetHTML());
     $oSource = CreateObject('dcl.htmlEntitySource');
     $t->assign('CMB_SOURCE', $oSource->GetCombo($aDefault['entity_source_id'], 'entity_source_id', 8, false));
     // Modules only show for selected products
     $oSelect->aOptions = array();
     $oSelect->sName = 'module_id';
     $oSelect->iSize = 8;
     $t->assign('CMB_MODULES', $oSelect->GetHTML());
     // Empty status is for selecting status type, then filtering status if desired
     $oSelect->sName = 'status';
     $oSelect->iSize = 8;
     $t->assign('CMB_STATUSESEMPTY', $oSelect->GetHTML());
     // Status Types
     $oSelect->sName = 'dcl_status_type';
     $oSelect->iSize = 8;
     $oSelect->vDefault = $aDefault['statuses.dcl_status_type'];
     $oSelect->SetOptionsFromDb('dcl_status_type', 'dcl_status_type_id', 'dcl_status_type_name', '', 'dcl_status_type_id');
     $t->assign('CMB_STATUSTYPES', $oSelect->GetHTML());
     if ($g_oSec->HasPerm(DCL_ENTITY_TICKET, DCL_PERM_ACTION)) {
         $t->assign('CHK_SECLVLWO', ' CHECKED');
         $t->assign('CHK_NOSECLVLWO', '');
     } else {
         $t->assign('CHK_SECLVLWO', '');
         $t->assign('CHK_NOSECLVLWO', ' CHECKED');
     }
     $t->assign('VAL_SEARCHTEXT', '');
     if ($bView && count($oView->filterlike) > 0) {
         $searchText = '';
         foreach ($oView->filterlike as $field => $values) {
             $searchText = $values[0];
         }
         $t->assign('VAL_SEARCHTEXT', $searchText);
     }
     if (isset($oView->filter['dcl_tag.tag_desc']) && is_array($oView->filter['dcl_tag.tag_desc']) && count($oView->filter['dcl_tag.tag_desc']) > 0) {
         $t->assign('VAL_TAGS', join(',', $oView->filter['dcl_tag.tag_desc']));
     }
     $aDateChecks = array('createdon', 'closedon', 'statuson', 'lastactionon');
     for ($i = 0; $i < count($aDateChecks); $i++) {
         $t->assign('CHK_' . strtoupper($aDateChecks[$i]), '');
     }
     if ($bView) {
         $t->assign('VAL_DATEFROM', '');
         $t->assign('VAL_DATETO', '');
         if (count($oView->filterdate) > 0) {
             $fromDate = '';
             $toDate = '';
             reset($oView->filterdate);
             while (list($field, $values) = each($oView->filterdate)) {
                 $t->assign('CHK_' . strtoupper($field), ' CHECKED');
                 $fromDate = $values[0];
                 $toDate = $values[1];
             }
             $t->assign('VAL_DATEFROM', $fromDate);
             $t->assign('VAL_DATETO', $toDate);
         }
     } else {
         $aFewDaysAgo = mktime(0, 0, 0, date('m'), date('d') - 3, date('Y'));
         $t->assign('VAL_DATEFROM', date($dcl_info['DCL_DATE_FORMAT'], $aFewDaysAgo));
         $t->assign('VAL_DATETO', date($dcl_info['DCL_DATE_FORMAT']));
     }
     $aCols = array('ticketid' => STR_TCK_TICKET . '#', 'responsible.short' => STR_TCK_RESPONSIBLE, 'products.name' => STR_TCK_PRODUCT, 'dcl_org.name' => STR_TCK_ACCOUNT, 'statuses.name' => STR_TCK_STATUS, 'summary' => STR_TCK_SUMMARY, 'dcl_product_module.module_name' => STR_CMMN_MODULE, 'dcl_tag.tag_desc' => STR_CMMN_TAGS, 'version' => STR_TCK_VERSION, 'createdby.short' => STR_TCK_OPENEDBY, 'createdon' => STR_TCK_OPENEDON, 'closedby.short' => STR_TCK_CLOSEDBY, 'closedon' => STR_TCK_CLOSEDON, 'statuson' => STR_TCK_STATUSON, 'lastactionon' => STR_TCK_LASTACTIONON, 'priorities.name' => STR_TCK_PRIORITY, 'severities.name' => STR_TCK_TYPE, 'dcl_contact.last_name' => 'Contact Last Name', 'dcl_contact.first_name' => 'Contact First Name', 'dcl_contact_phone.phone_number' => STR_TCK_CONTACTPHONE, 'dcl_contact_email.email_addr' => STR_TCK_CONTACTEMAIL, 'issue' => STR_TCK_ISSUE, 'seconds' => STR_TCK_APPROXTIME, 'dcl_status_type.dcl_status_type_name' => STR_CMMN_STATUSTYPE, 'dcl_entity_source.entity_source_name' => 'Source', 'is_public' => 'Public');
     if ($bView) {
         $aShow = array();
         $aGroup = array();
         foreach ($oView->columns as $colName) {
             if ($colName == 'a.short') {
                 $colName = 'responsible.short';
             } else {
                 if ($colName == 'b.short') {
                     $colName = 'closedby.short';
                 } else {
                     if ($colName == 'c.short') {
                         $colName = 'createdby.short';
                     }
                 }
             }
             $aShow[$colName] = $aCols[$colName];
         }
         foreach ($oView->groups as $colName) {
             if ($colName == 'a.short') {
                 $colName = 'responsible.short';
             } else {
                 if ($colName == 'b.short') {
                     $colName = 'closedby.short';
                 } else {
                     if ($colName == 'c.short') {
                         $colName = 'createdby.short';
                     }
                 }
             }
             $aGroup[$colName] = $aCols[$colName];
         }
     } else {
         $aShow = array('ticketid' => STR_TCK_TICKET . '#', 'responsible.short' => STR_TCK_RESPONSIBLE, 'products.name' => STR_TCK_PRODUCT, 'dcl_org.name' => STR_TCK_ACCOUNT, 'statuses.name' => STR_TCK_STATUS, 'summary' => STR_TCK_SUMMARY);
         $aGroup = array();
     }
     array_remove_keys($aCols, $aShow);
     array_remove_keys($aCols, $aGroup);
     $t->assign('VAL_COLS', $aCols);
     $t->assign('VAL_SHOW', $aShow);
     $t->assign('VAL_GROUP', $aGroup);
     if ($bView) {
         $aOrder = array();
         foreach ($oView->order as $val) {
             if ($val == 'priorities.weight') {
                 $sText = $aShow['priorities.name'];
             } else {
                 if ($val == 'severities.weight') {
                     $sText = $aShow['severities.name'];
                 } else {
                     $sText = $aShow[$val];
                 }
             }
             array_push($aOrder, array($val => $sText));
         }
         $t->assign('VAL_SORT');
     }
     SmartyDisplay($t, 'htmlTicketSearch.tpl');
 }
Esempio n. 10
0
 /**
  * Метод формирует сщвуржимое db.ini файла для развёрнутой схемы.
  * 
  * За основу берутся текущие натсройки db.ini, которые могут быть расширены 
  * или сокращены (если таблица удалена из схемы).
  * 
  * @param string $scope - тип развёрнутой схемы.
  *                      Она может быть развёрнута, как SDK или как проектная.
  *                      Считаем, что в схему могли как добавиться новые таблицы,
  *                      так и кол-во таблиц в схеме могло быть сокращено.
  * @return array - настройки таблиц для db.ini
  */
 public static function makeDbIniForSchema($scope, array $dbTables)
 {
     /*
      * Список таблиц SDK можно получить из db.ini, так как если мы работаем по SDK,
      * то нужно взять старые настройки и порядок таблиц.
      * Если же мы работаем по проектному скоупу, то db.ini для SDK уже актуален.
      */
     $sdkTableNames = DbIni::getSdkTables();
     $settings = array();
     switch ($scope) {
         case ENTITY_SCOPE_SDK:
             foreach ($sdkTableNames as $tableName) {
                 if (!array_key_exists($tableName, $dbTables)) {
                     //Таблица была исключена из схемы
                     continue;
                     //---
                 }
                 $table = array_get_value_unset($tableName, $dbTables);
                 $settings[$tableName] = array();
                 /* @var $property PsTableColumnProps */
                 foreach (PsTableColumnProps::getAllowedTableProperties($table) as $propName => $property) {
                     $settings[$tableName][$propName] = $table->isProperty($property);
                 }
                 /* @var $property PsTableColumnProps */
                 foreach (PsTableColumnProps::getAllowedColumnProperties($table) as $propName => $property) {
                     /* @var $col PsTableColumn */
                     foreach ($table->getColumns() as $colName => $col) {
                         if ($col->isProperty($property)) {
                             $settings[$tableName][$propName][] = $colName;
                         }
                     }
                 }
             }
             /*
              * Добавляем несконфигурированные таблицы
              */
             foreach ($dbTables as $tableName => $table) {
                 $settings[$tableName] = array();
                 /* @var $property PsTableColumnProps */
                 foreach (PsTableColumnProps::getAllowedTableProperties($dbTables[$tableName]) as $propName => $property) {
                     $settings[$tableName][$propName] = false;
                 }
             }
             break;
         case ENTITY_SCOPE_PROJ:
             //Сразу удаляем из списка все таблицы SDK
             array_remove_keys($dbTables, $sdkTableNames);
             foreach (DbIni::getProjectTables() as $tableName) {
                 if (!array_key_exists($tableName, $dbTables)) {
                     //Таблица была исключена из схемы или перенесена в SDK
                     continue;
                     //---
                 }
                 $table = array_get_value_unset($tableName, $dbTables);
                 $settings[$tableName] = array();
                 /* @var $property PsTableColumnProps */
                 foreach (PsTableColumnProps::getAllowedTableProperties($table) as $propName => $property) {
                     $settings[$tableName][$propName] = $table->isProperty($property);
                 }
                 /* @var $property PsTableColumnProps */
                 foreach (PsTableColumnProps::getAllowedColumnProperties($table) as $propName => $property) {
                     /* @var $col PsTableColumn */
                     foreach ($table->getColumns() as $colName => $col) {
                         if ($col->isProperty($property)) {
                             $settings[$tableName][$propName][] = $colName;
                         }
                     }
                 }
             }
             /*
              * Не добавляем несконфигурированные таблицы, так как для проектных 
              * таблиц мы не требуем полного перечисления в db.ini
              */
             break;
         default:
             raise_error("Unknown scope [{$scope}]");
     }
     return $settings;
 }