Example #1
1
function initializeGui(&$dbHandler, &$argsObj, &$cfgObj, &$tplanMgr, &$tcaseMgr)
{
    $buildMgr = new build_mgr($dbHandler);
    $platformMgr = new tlPlatform($dbHandler, $argsObj->tproject_id);
    $gui = new stdClass();
    $gui->tplan_id = $argsObj->tplan_id;
    $gui->tproject_id = $argsObj->tproject_id;
    $gui->build_id = $argsObj->build_id;
    $gui->platform_id = $argsObj->platform_id;
    $gui->execStatusValues = null;
    $gui->can_use_bulk_op = 0;
    $gui->exec_notes_editors = null;
    $gui->bulk_exec_notes_editor = null;
    $gui->req_details = null;
    $gui->attachmentInfos = null;
    $gui->bugs = null;
    $gui->other_exec_cfields = null;
    $gui->ownerDisplayName = null;
    $gui->editorType = $cfgObj->editorCfg['type'];
    $gui->filter_assigned_to = $argsObj->filter_assigned_to;
    $gui->tester_id = $argsObj->user_id;
    $gui->include_unassigned = $argsObj->include_unassigned;
    $gui->tpn_view_status = $argsObj->tpn_view_status;
    $gui->bn_view_status = $argsObj->bn_view_status;
    $gui->bc_view_status = $argsObj->bc_view_status;
    $gui->platform_notes_view_status = $argsObj->platform_notes_view_status;
    $gui->refreshTree = $argsObj->refreshTree;
    if (!$argsObj->status || $argsObj->status == $cfgObj->tc_status['not_run']) {
        $gui->refreshTree = 0;
    }
    $gui->map_last_exec_any_build = null;
    $gui->map_last_exec = null;
    // 20081122 - franciscom
    // Just for the record:
    // doing this here, we avoid to do on processTestSuite() and processTestCase(),
    // but absolutely this will not improve in ANY WAY perfomance, because we do not loop
    // over these two functions.
    $tprojectMgr = new testproject($dbHandler);
    $gui->tcasePrefix = $tprojectMgr->getTestCasePrefix($argsObj->tproject_id);
    $build_info = $buildMgr->get_by_id($argsObj->build_id);
    $gui->build_notes = $build_info['notes'];
    $gui->build_is_open = $build_info['is_open'] == 1 ? 1 : 0;
    $gui->execution_types = $tcaseMgr->get_execution_types();
    if ($argsObj->filter_assigned_to) {
        $userSet = tlUser::getByIds($dbHandler, array_values($argsObj->filter_assigned_to));
        if ($userSet) {
            foreach ($userSet as $key => $userObj) {
                $gui->ownerDisplayName[$key] = $userObj->getDisplayName();
            }
        }
    }
    // ------------------------------------------------------------------
    $the_builds = $tplanMgr->get_builds_for_html_options($argsObj->tplan_id);
    $gui->build_name = isset($the_builds[$argsObj->build_id]) ? $the_builds[$argsObj->build_id] : '';
    // 20090419 - franciscom
    $gui->grants = initializeRights($dbHandler, $argsObj->user, $argsObj->tproject_id, $argsObj->tplan_id);
    $gui->exec_mode = initializeExecMode($dbHandler, $cfgObj->exec_cfg, $argsObj->user, $argsObj->tproject_id, $argsObj->tplan_id);
    $rs = $tplanMgr->get_by_id($argsObj->tplan_id);
    $gui->testplan_notes = $rs['notes'];
    // Important note:
    // custom fields for test plan can be edited ONLY on design, that's reason why we are using
    // scope = 'design' instead of 'execution'
    $gui->testplan_cfields = $tplanMgr->html_table_of_custom_field_values($argsObj->tplan_id, 'design', array('show_on_execution' => 1));
    $gui->history_on = manage_history_on($_REQUEST, $_SESSION, $cfgObj->exec_cfg, 'btn_history_on', 'btn_history_off', 'history_on');
    $gui->history_status_btn_name = $gui->history_on ? 'btn_history_off' : 'btn_history_on';
    $dummy = $platformMgr->getLinkedToTestplan($argsObj->tplan_id);
    $gui->has_platforms = !is_null($dummy) ? 1 : 0;
    $gui->platform_info['id'] = 0;
    $gui->platform_info['name'] = '';
    if (!is_null($argsObj->platform_id) && $argsObj->platform_id > 0) {
        $gui->platform_info = $platformMgr->getByID($argsObj->platform_id);
    }
    $gui->node_id = $argsObj->id;
    return $gui;
}
Example #2
0
require '../../config.inc.php';
require_once "common.php";
require_once "web_editor.php";
$editorCfg = getWebEditorCfg('build');
require_once require_web_editor($editorCfg['type']);
testlinkInitPage($db, false, false, "checkRights");
$templateCfg = templateConfiguration();
$date_format_cfg = config_get('date_format');
$op = new stdClass();
$op->user_feedback = '';
$op->buttonCfg = new stdClass();
$op->buttonCfg->name = "";
$op->buttonCfg->value = "";
$smarty = new TLSmarty();
$tplan_mgr = new testplan($db);
$build_mgr = new build_mgr($db);
$args = init_args($_REQUEST, $_SESSION, $date_format_cfg);
$gui = new stdClass();
$gui->tplan_id = $args->tplan_id;
$gui->main_descr = lang_get('title_build_2') . config_get('gui_title_separator_2') . lang_get('test_plan') . config_get('gui_title_separator_1') . $args->tplan_name;
$of = web_editor('notes', $_SESSION['basehref'], $editorCfg);
$of->Value = getItemTemplateContents('build_template', $of->InstanceName, $args->notes);
$gui->cfields = $build_mgr->html_custom_field_inputs($args->build_id, $args->testprojectID, 'design', '', $_REQUEST);
$op = new stdClass();
$op->operation_descr = '';
$op->user_feedback = '';
$op->buttonCfg = '';
$op->status_ok = 1;
switch ($args->do_action) {
    case 'edit':
        $op = edit($args, $build_mgr, $date_format_cfg);
Example #3
0
function saveImportedResultData(&$db, $resultData, $context)
{
    if (!$resultData) {
        return;
    }
    $debugMsg = ' FUNCTION: ' . __FUNCTION__;
    $tables = tlObjectWithDB::getDBTables(array('executions', 'execution_bugs'));
    $l18n = array('import_results_tc_not_found' => '', 'import_results_invalid_result' => '', 'tproject_id_not_found' => '', 'import_results_ok' => '');
    foreach ($l18n as $key => $value) {
        $l18n[$key] = lang_get($key);
    }
    // Get Column definitions to get size dinamically instead of create constants
    $columnDef = array();
    $adodbObj = $db->get_dbmgr_object();
    $columnDef['execution_bugs'] = $adodbObj->MetaColumns($tables['execution_bugs']);
    $keySet = array_keys($columnDef['execution_bugs']);
    foreach ($keySet as $keyName) {
        if (($keylow = strtolower($keyName)) != $keyName) {
            $columnDef['execution_bugs'][$keylow] = $columnDef['execution_bugs'][$keyName];
            unset($columnDef['execution_bugs'][$keyName]);
        }
    }
    $user = new tlUser($context->userID);
    $user->readFromDB($db);
    $tcase_mgr = new testcase($db);
    $resulstCfg = config_get('results');
    $tcaseCfg = config_get('testcase_cfg');
    $resultMap = array();
    $tplan_mgr = null;
    $tc_qty = sizeof($resultData);
    if ($tc_qty) {
        $tplan_mgr = new testplan($db);
        $tproject_mgr = new testproject($db);
        $build_mgr = new build_mgr($db);
    }
    // Need to do checks on common settings
    //
    // test project exists
    //
    // test plan id:
    //              belongs to target test project
    //              is active
    // build id:
    //          belongs to target test plan
    //          is open
    //
    // platform id:
    //          is linked  to target test plan
    //
    // execution type if not present -> set to MANUAL
    //          if presente is valid i.e. inside the TL domain
    //
    $checks = array();
    $checks['status_ok'] = true;
    $checks['msg'] = null;
    $dummy = null;
    if (!is_null($context->tprojectID) && intval($context->tprojectID) > 0) {
        $dummy = array($tproject_mgr->get_by_id($context->tprojectID, array('output' => 'existsByID')));
    } else {
        if (!is_null($context->tprojectName)) {
            $dummy = $tproject_mgr->get_by_name($context->tprojectName, null, array('output' => 'existsByName'));
        }
    }
    $checks['status_ok'] = !is_null($dummy);
    if (!$checks['status_ok']) {
        $checks['msg'][] = sprintf($l18n['tproject_id_not_found'], $context->tprojectID);
    }
    if (!$checks['status_ok']) {
        foreach ($checks['msg'] as $warning) {
            $resultMap[] = array($warning);
        }
    }
    if ($doIt = $checks['status_ok']) {
        $context->tprojectID = $dummy[0]['id'];
    }
    // --------------------------------------------------------------------
    $dummy = null;
    if (!is_null($context->tplanID) && intval($context->tplanID) > 0) {
        $dummy = $tplan_mgr->get_by_id($context->tplanID, array('output' => 'minimun'));
        if (!is_null($dummy)) {
            $dummy['id'] = $context->tplanID;
        }
    } else {
        if (!is_null($context->tplanName)) {
            $dummy = $tplan_mgr->get_by_name($context->tplanName, $context->tprojectID, array('output' => 'minimun'));
            if (!is_null($dummy)) {
                $dummy = $dummy[0];
            }
        }
    }
    if (!is_null($dummy)) {
        $context->tplanID = $dummy['id'];
    }
    if (intval($context->tprojectID) <= 0 && intval($context->tplanID) > 0) {
        $dummy = $tplan_mgr->tree_manager->get_node_hierarchy_info($context->tplanID);
        $context->tprojectID = $dummy['parent_id'];
    }
    // --------------------------------------------------------------------
    // --------------------------------------------------------------------
    $dummy = null;
    $tplan_mgr->platform_mgr->setTestProjectID($context->tprojectID);
    if (!is_null($context->platformID) && intval($context->platformID) > 0) {
        $dummy = array($tplan_mgr->platform_mgr->getByID($context->platformID));
    } else {
        if (property_exists($context, 'platformName') && !is_null($context->platformName)) {
            if (!is_null($xx = $tplan_mgr->platform_mgr->getID($context->platformName))) {
                $dummy = array(0 => array('id' => $xx));
            }
        }
    }
    if (!is_null($dummy)) {
        $context->platformID = $dummy[0]['id'];
    }
    // --------------------------------------------------------------------
    // --------------------------------------------------------------------
    $optGB = array('tplan_id' => $context->tplanID, 'output' => 'minimun');
    $dummy = null;
    if (!is_null($context->buildID) && intval($context->buildID) > 0) {
        $dummy = array($build_mgr->get_by_id($context->buildID, $optGB));
    } else {
        if (!is_null($context->buildName)) {
            $dummy = $build_mgr->get_by_name($context->buildName, $optGB);
        }
    }
    if (!is_null($dummy)) {
        $context->buildID = $dummy[0]['id'];
    }
    // --------------------------------------------------------------------
    // --------------------------------------------------------------------
    for ($idx = 0; $doIt && $idx < $tc_qty; $idx++) {
        $tester_id = 0;
        $tester_name = '';
        $using_external_id = false;
        $message = null;
        $status_ok = true;
        $tcase_exec = $resultData[$idx];
        // New attribute "execution type" makes old XML import files incompatible
        // Important NOTICE:
        // tcase_exec is passed BY REFERENCE to allow check_exec_values()change execution type if needed
        //
        $checks = check_exec_values($db, $tcase_mgr, $user_mgr, $tcaseCfg, $tcase_exec, $columnDef['execution_bugs']);
        $status_ok = $checks['status_ok'];
        if ($status_ok) {
            $tcase_id = $checks['tcase_id'];
            $tcase_external_id = trim($tcase_exec['tcase_external_id']);
            $tester_id = $checks['tester_id'];
            // external_id has precedence over internal id
            $using_external_id = $tcase_external_id != "";
        } else {
            foreach ($checks['msg'] as $warning) {
                $resultMap[] = array($warning);
            }
        }
        if ($status_ok) {
            $tcase_identity = $using_external_id ? $tcase_external_id : $tcase_id;
            $result_code = strtolower($tcase_exec['result']);
            $result_is_acceptable = isset($resulstCfg['code_status'][$result_code]) ? true : false;
            $notes = $tcase_exec['notes'];
            $message = null;
            $info_on_case = $tplan_mgr->getLinkInfo($context->tplanID, $tcase_id, $context->platformID);
            if (is_null($info_on_case)) {
                $message = sprintf($l18n['import_results_tc_not_found'], $tcase_identity);
            } else {
                if (!$result_is_acceptable) {
                    $message = sprintf($l18n['import_results_invalid_result'], $tcase_identity, $tcase_exec['result']);
                } else {
                    $info_on_case = current($info_on_case);
                    $tcversion_id = $info_on_case['tcversion_id'];
                    $version = $info_on_case['version'];
                    $notes = $db->prepare_string(trim($notes));
                    // N.B.: db_now() returns an string ready to be used in an SQL insert
                    //       example '2008-09-04', while $tcase_exec["timestamp"] => 2008-09-04
                    //
                    $execution_ts = $tcase_exec['timestamp'] != '' ? "'" . $tcase_exec["timestamp"] . "'" : $db->db_now();
                    if ($tester_id != 0) {
                        $tester_name = $tcase_exec['tester'];
                    } else {
                        $tester_name = $user->login;
                        $tester_id = $context->userID;
                    }
                    $addExecDuration = strlen($tcase_exec['execution_duration']) > 0 && is_numeric($tcase_exec['execution_duration']);
                    $sql = " /* {$debugMsg} */ " . " INSERT INTO {$tables['executions']} (build_id,tester_id,status,testplan_id," . " tcversion_id,execution_ts,notes,tcversion_number,platform_id,execution_type" . ($addExecDuration ? ',execution_duration' : '') . ")" . " VALUES ({$context->buildID}, {$tester_id},'{$result_code}',{$context->tplanID}, " . " {$tcversion_id},{$execution_ts},'{$notes}', {$version}, " . " {$context->platformID}, {$tcase_exec['execution_type']}" . ($addExecDuration ? ",{$tcase_exec['execution_duration']}" : '') . ")";
                    $db->exec_query($sql);
                    if (isset($tcase_exec['bug_id']) && !is_null($tcase_exec['bug_id']) && is_array($tcase_exec['bug_id'])) {
                        $execution_id = $db->insert_id($tables['executions']);
                        foreach ($tcase_exec['bug_id'] as $bug_id) {
                            $bug_id = trim($bug_id);
                            $sql = " /* {$debugMsg} */ " . " SELECT execution_id AS check_qty FROM  {$tables['execution_bugs']} " . " WHERE bug_id = '{$bug_id}' AND execution_id={$execution_id} ";
                            $rs = $db->get_recordset($sql);
                            if (is_null($rs)) {
                                $sql = " /* {$debugMsg} */ " . " INSERT INTO {$tables['execution_bugs']} (bug_id,execution_id)" . " VALUES ('" . $db->prepare_string($bug_id) . "', {$execution_id} )";
                                $db->exec_query($sql);
                            }
                        }
                    }
                    $message = sprintf($l18n['import_results_ok'], $tcase_identity, $version, $tester_name, $resulstCfg['code_status'][$result_code], $execution_ts);
                }
            }
        }
        if (!is_null($message)) {
            $resultMap[] = array($message);
        }
    }
    return $resultMap;
}
Example #4
0
function initializeGui(&$dbHandler, &$argsObj, &$cfgObj, &$tplanMgr)
{
    $buildMgr = new build_mgr($dbHandler);
    $platformMgr = new tlPlatform($dbHandler, $argsObj->tproject_id);
    $gui = new stdClass();
    $gui->form_token = $argsObj->form_token;
    $gui->remoteExecFeedback = $gui->user_feedback = '';
    $gui->tplan_id = $argsObj->tplan_id;
    $gui->tproject_id = $argsObj->tproject_id;
    $gui->build_id = $argsObj->build_id;
    $gui->platform_id = $argsObj->platform_id;
    $gui->attachmentInfos = null;
    $gui->refreshTree = 0;
    // Just for the records:
    // doing this here, we avoid to do on processTestSuite() and processTestCase(),
    // but absolutely this will not improve in ANY WAY perfomance, because we do not loop
    // over these two functions.
    $tprojectMgr = new testproject($dbHandler);
    $gui->tcasePrefix = $tprojectMgr->getTestCasePrefix($argsObj->tproject_id);
    $build_info = $buildMgr->get_by_id($argsObj->build_id);
    $gui->build_notes = $build_info['notes'];
    $gui->build_is_open = $build_info['is_open'] == 1 ? 1 : 0;
    $dummy = $tplanMgr->get_builds_for_html_options($argsObj->tplan_id);
    $gui->build_name = isset($dummy[$argsObj->build_id]) ? $dummy[$argsObj->build_id] : '';
    $rs = $tplanMgr->get_by_id($argsObj->tplan_id);
    $gui->testplan_notes = $rs['notes'];
    $gui->testplan_name = $rs['name'];
    // Important note:
    // custom fields for test plan can be edited ONLY on design, that's reason why we are using
    // scope = 'design' instead of 'execution'
    $gui->testplan_cfields = $tplanMgr->html_table_of_custom_field_values($argsObj->tplan_id, 'design', array('show_on_execution' => 1));
    $gui->build_cfields = $buildMgr->html_table_of_custom_field_values($argsObj->build_id, $argsObj->tproject_id, 'design', array('show_on_execution' => 1));
    $dummy = $platformMgr->getLinkedToTestplan($argsObj->tplan_id);
    $gui->has_platforms = !is_null($dummy) ? 1 : 0;
    $gui->platform_info['id'] = 0;
    $gui->platform_info['name'] = '';
    if (!is_null($argsObj->platform_id) && $argsObj->platform_id > 0) {
        $gui->platform_info = $platformMgr->getByID($argsObj->platform_id);
    }
    $gui->pageTitlePrefix = lang_get('execution_context') . ':';
    return $gui;
}
Example #5
0
/**
 * 
 *
 */
function contextAsXML(&$dbHandler, $contextSet, &$tplanMgr)
{
    $info = array();
    $tprojectMgr = new testproject($dbHandler);
    $info['tproject'] = $tprojectMgr->get_by_id($contextSet->tproject_id);
    unset($tprojectMgr);
    $info['tplan'] = $tplanMgr->get_by_id($contextSet->tplan_id);
    $buildMgr = new build_mgr($dbHandler);
    $info['build'] = $buildMgr->get_by_id($contextSet->build_id);
    unset($buildMgr);
    $info['platform'] = null;
    $platform_template = '';
    if ($contextSet->platform_id > 0) {
        $platformMgr = new tlPlatform($dbHandler, $contextSet->tproject_id);
        $info['platform'] = $platformMgr->getByID($contextSet->platform_id);
        unset($platformMgr);
        $platform_template = "\n\t" . "<platform>" . "\t\t" . "<name><![CDATA[||PLATFORMNAME||]]></name>" . "\t\t" . "<internal_id><![CDATA[||PLATFORMID||]]></internal_id>" . "\n\t" . "</platform>";
    }
    $key2loop = array_keys($info);
    foreach ($key2loop as $item_key) {
        if (!is_null($info[$item_key])) {
            $contextInfo[$item_key . '_id'] = $info[$item_key]['id'];
            $contextInfo[$item_key . '_name'] = $info[$item_key]['name'];
        }
    }
    $contextInfo['prefix'] = $info['tproject']['prefix'];
    $xml_root = "<context>{{XMLCODE}}\n</context>";
    $xml_template = "\n\t" . "<testproject>" . "\t\t" . "<name><![CDATA[||TPROJECTNAME||]]></name>" . "\t\t" . "<internal_id><![CDATA[||TPROJECTID||]]></internal_id>" . "\t\t" . "<prefix><![CDATA[||TPROJECTPREFIX||]]></prefix>" . "\n\t" . "</testproject>" . "\n\t" . "<testplan>" . "\t\t" . "<name><![CDATA[||TPLANNAME||]]></name>" . "\t\t" . "<internal_id><![CDATA[||TPLANID||]]></internal_id>" . "\n\t" . "</testplan>" . $platform_template . "\n\t" . "<build>" . "\t\t" . "<name><![CDATA[||BUILDNAME||]]></name>" . "\t\t" . "<internal_id><![CDATA[||BUILDID||]]></internal_id>" . "\n\t" . "</build>";
    $xml_mapping = null;
    $xml_mapping = array("||TPROJECTNAME||" => "tproject_name", "||TPROJECTID||" => 'tproject_id', "||TPROJECTPREFIX||" => "prefix", "||TPLANNAME||" => "tplan_name", "||TPLANID||" => 'tplan_id', "||BUILDNAME||" => "build_name", "||BUILDID||" => 'build_id', "||PLATFORMNAME||" => "platform_name", "||PLATFORMID||" => 'platform_id');
    $mm = array($contextInfo);
    $contextXML = exportDataToXML($mm, $xml_root, $xml_template, $xml_mapping, 'noXMLHeader' == 'noXMLHeader');
    // echo '<pre><xmp>';
    // echo $contextXML;
    // echo '</xmp></pre>';
    return $contextXML;
}
Example #6
0
 $image_link = $exec_link . $edit_link . $tcaseName;
 $mail_link = "<a href=\"javascript:openTCEditWindow({$testcase['tc_id']});\">{$tcaseName}</a> ";
 $tcLink = $args->format == FORMAT_MAIL_HTML ? $mail_link : $image_link;
 //$tcLink = '<a href="lib/testcases/archiveData.php?edit=testcase&id=' .
 //          $testcase['tc_id'] . '">' . htmlspecialchars($tcaseName) . '</a>';
 if (!isset($pathCache[$testcase['tc_id']])) {
     $dummy = $tcase_mgr->getPathLayered(array($testcase['tc_id']));
     $pathCache[$testcase['tc_id']] = $dummy[$testcase['testsuite_id']]['value'];
     $levelCache[$testcase['tc_id']] = $dummy[$testcase['testsuite_id']]['level'];
     $ky = current(array_keys($dummy));
     $topCache[$testcase['tc_id']] = $ky;
 }
 $verbosePath = $pathCache[$testcase['tc_id']];
 $level = $levelCache[$testcase['tc_id']];
 if ($args->type == $statusCode['not_run']) {
     $build_mgr = new build_mgr($db);
     if (isset($testcase['assigned_build_id'])) {
         $build_info = $build_mgr->get_by_id($testcase['assigned_build_id']);
         $testcase['assigned_build_name'] = $build_info['name'];
     } else {
         $testcase['assigned_build_name'] = lang_get('unassigned');
     }
     // When not run, test case version, is the version currently linked to test plan
     $topLevelSuites[$topCache[$testcase['tc_id']]]['items'][$level][] = array('suiteName' => $verbosePath, 'level' => $level, 'testTitle' => $tcLink, 'testVersion' => $testcase['version'], 'platformName' => htmlspecialchars($testcase['platform_name']), 'buildName' => htmlspecialchars($testcase['assigned_build_name']), 'testerName' => htmlspecialchars($testerName), 'notes' => strip_tags($testcase['summary']), 'platformID' => $testcase['platform_id']);
 } else {
     // BUGID 3492
     // BUGID 3356
     // When test case has been runned, version must be get from executions.tcversion_number
     if ($gui->bugInterfaceOn) {
         $bugs = get_bugs_for_exec($db, $bugInterface, $testcase['exec_id']);
         //count all test cases that have no bug linked
 *
 * @filesource	tc_exec_unassign_all.php
 * @package		TestLink
 * @author		Andreas Simon
 * @copyright	2005-2010, TestLink community 
 * @link		http://www.teamst.org/index.php
 *
 * @internal revisions:
 * 
 */
require_once dirname(__FILE__) . "/../../config.inc.php";
require_once "common.php";
testlinkInitPage($db);
$assignment_mgr = new assignment_mgr($db);
$testplan_mgr = new testplan($db);
$build_mgr = new build_mgr($db);
$templateCfg = templateConfiguration();
$args = init_args($testplan_mgr->tree_manager);
checkRights($db, $_SESSION['currentUser'], $args);
$gui = init_gui($db, $args);
$assignment_count = 0;
$build_name = "";
if ($args->build_id) {
    $assignment_count = $assignment_mgr->get_count_of_assignments_for_build_id($args->build_id);
    $build_info = $build_mgr->get_by_id($args->build_id);
    $build_name = $build_info['name'];
}
if ($assignment_count > 0) {
    if ($args->confirmed) {
        // their deletion has been confirmed, so delete them
        $assignment_mgr->delete_by_build_id($args->build_id);
/**
 * render Test Case content for generated documents
 * 
 * @param $integer db DB connection identifier 
 * @return string generated html code
 *
 * @internal revisions
 */
function renderTestCaseForPrinting(&$db, &$node, &$options, $env, $context, $indentLevel)
{
    static $req_mgr;
    static $tc_mgr;
    static $build_mgr;
    static $tplan_mgr;
    static $tplan_urgency;
    static $labels;
    static $tcase_prefix;
    static $userMap = array();
    static $cfg;
    static $tables = null;
    static $force = null;
    static $bugInterfaceOn = false;
    static $its;
    static $buildCfields;
    static $statusL10N;
    static $docRepo;
    static $st;
    $code = null;
    $tcInfo = null;
    $tcResultInfo = null;
    $tcase_pieces = null;
    $id = $node['id'];
    $level = $indentLevel;
    $prefix = isset($context['prefix']) ? $context['prefix'] : null;
    $tplan_id = isset($context['tplan_id']) ? $context['tplan_id'] : 0;
    $tprojectID = isset($context['tproject_id']) ? $context['tproject_id'] : 0;
    $platform_id = isset($context['platform_id']) ? $context['platform_id'] : 0;
    $build_id = isset($context['build_id']) ? $context['build_id'] : 0;
    // init static elements
    if (!$tables) {
        $st = new stdClass();
        $tables = tlDBObject::getDBTables(array('executions', 'builds', 'execution_tcsteps'));
        $tc_mgr = new testcase($db);
        $tplan_urgency = new testPlanUrgency($db);
        $build_mgr = new build_mgr($db);
        $tplan_mgr = new testplan($db);
        $req_mgr = new requirement_mgr($db);
        list($cfg, $labels) = initRenderTestCaseCfg($tc_mgr, $options);
        if (!is_null($prefix)) {
            $tcase_prefix = $prefix;
        } else {
            list($tcase_prefix, $dummy) = $tc_mgr->getPrefix($id);
        }
        $tcase_prefix .= $cfg['testcase']->glue_character;
        $force['displayVersion'] = isset($options['displayVersion']) ? $options['displayVersion'] : false;
        $force['displayLastEdit'] = isset($options['displayLastEdit']) ? $options['displayLastEdit'] : false;
        $its = null;
        $tproject_mgr = new testproject($db);
        $info = $tproject_mgr->get_by_id($tprojectID);
        $bugInterfaceOn = $info['issue_tracker_enabled'];
        if ($info['issue_tracker_enabled']) {
            $it_mgr = new tlIssueTracker($db);
            $its = $it_mgr->getInterfaceObject($tprojectID);
            unset($it_mgr);
        }
        $statusL10N = null;
        foreach ($cfg['results']['code_status'] as $vc => $vstat) {
            if (isset($cfg['results']['status_label_for_exec_ui'][$vstat])) {
                $statusL10N[$vc] = lang_get($cfg['results']['status_label_for_exec_ui'][$vstat]);
            }
        }
        $docRepo = tlAttachmentRepository::create($db);
        $st->locationFilters = $tc_mgr->buildCFLocationMap();
        // change table style in case of single TC printing to not be indented
        $st->table_style = "";
        if (isset($options['docType']) && $options['docType'] == SINGLE_TESTCASE) {
            $st->table_style = 'style="margin-left: 0;"';
        }
        $st->cfieldFormatting = array('label_css_style' => '', 'add_table' => false, 'value_css_style' => ' colspan = "' . ($cfg['tableColspan'] - 1) . '" ');
        $info = null;
    }
    /** 
     * @TODO THIS IS NOT THE WAY TO DO THIS IS ABSOLUTELY WRONG AND MUST BE REFACTORED, 
     * using existent methods - franciscom - 20090329 
     * Need to get CF with execution scope
     */
    $exec_info = null;
    $getByID['filters'] = null;
    $opt = array();
    $opt['step_exec_notes'] = isset($options['step_exec_notes']) && $options['step_exec_notes'];
    $opt['step_exec_status'] = isset($options['step_exec_status']) && $options['step_exec_status'];
    switch ($options["docType"]) {
        case DOC_TEST_SPEC:
            $getByID['tcversion_id'] = testcase::LATEST_VERSION;
            $getExecutions = false;
            break;
        case SINGLE_TESTCASE:
            $getByID['tcversion_id'] = $node['tcversion_id'];
            $getExecutions = $options['passfail'] || $options['notes'] || $opt['step_exec_notes'] || $opt['step_exec_status'];
            break;
        default:
            $getByID['tcversion_id'] = $node['tcversion_id'];
            $getExecutions = $options['cfields'] || $options['passfail'] || $options['notes'] || $opt['step_exec_notes'] || $opt['step_exec_status'];
            break;
    }
    if ($getExecutions) {
        // Thanks to Evelyn from Cortado, have found a very old issue never reported.
        // 1. create TC-1A VERSION 1
        // 2. add to test plan and execute FAILED ON BUILD 1
        // 3. Request Test Report (Test Plan EXECUTION REPORT).
        //    You will get spec for VERSION 1 and result for VERSION 1 - OK cool!
        // 4. create VERSION 2
        // 5. update linked Test Case Versions
        // 6. do nothing more than repeat step 3
        //    without this fix you will get
        //    You will get spec for VERSION 2 and result for VERSION 1 - Hmmm
        //    and in addition is not clear that execution was on VERSION 1 . No GOOD!!
        //
        // HOW has been fixed ?
        // Getting info about THE CURRENT LINKED test case version and looking for
        // exec info for this.
        //
        // ATTENTION: THIS IS OK ONLY WHEN BUILD ID is not provided
        //
        //
        // Get Linked test case version
        $linkedItem = $tplan_mgr->getLinkInfo($tplan_id, $id, $platform_id);
        $sql = " SELECT E.id AS execution_id, E.status, E.execution_ts, E.tester_id," . " E.notes, E.build_id, E.tcversion_id,E.tcversion_number,E.testplan_id," . " E.execution_type, E.execution_duration, " . " B.name AS build_name " . " FROM {$tables['executions']} E " . " JOIN {$tables['builds']} B ON B.id = E.build_id " . " WHERE 1 = 1 ";
        if (isset($context['exec_id'])) {
            $sql .= " AND E.id=" . intval($context['exec_id']);
        } else {
            $sql .= " AND E.testplan_id = " . intval($tplan_id) . " AND E.platform_id = " . intval($platform_id) . " AND E.tcversion_id = " . intval($linkedItem[0]['tcversion_id']);
            if ($build_id > 0) {
                $sql .= " AND E.build_id = " . intval($build_id);
            } else {
                // We are looking for LATEST EXECUTION of CURRENT LINKED test case version
                $sql .= " AND E.tcversion_number=" . intval($linkedItem[0]['version']);
            }
            $sql .= " ORDER BY execution_id DESC";
        }
        $exec_info = $db->get_recordset($sql, null, 1);
        $getByID['tcversion_id'] = $linkedItem[0]['tcversion_id'];
        $getByID['filters'] = null;
        $linkedItem = null;
        if (!is_null($exec_info)) {
            $getByID['tcversion_id'] = null;
            $getByID['filters'] = array('version_number' => $exec_info[0]['tcversion_number']);
            if (isset($options['build_cfields']) && $options['build_cfields']) {
                if (!isset($buildCfields[$exec_info[0]['build_id']])) {
                    $buildCfields[$exec_info[0]['build_id']] = $build_mgr->html_table_of_custom_field_values($exec_info[0]['build_id'], $tprojectID);
                }
            }
        }
    }
    $tcInfo = $tc_mgr->get_by_id($id, $getByID['tcversion_id'], $getByID['filters'], array('renderGhost' => true, 'renderImageInline' => true));
    if ($tcInfo) {
        $tcInfo = $tcInfo[0];
    }
    $external_id = $tcase_prefix . $tcInfo['tc_external_id'];
    $name = htmlspecialchars($node['name']);
    $cfields = array('specScope' => null, 'execScope' => null);
    if ($options['cfields']) {
        // Get custom fields that has specification scope
        // Custom Field values at Test Case VERSION Level
        foreach ($st->locationFilters as $fkey => $fvalue) {
            $cfields['specScope'][$fkey] = $tc_mgr->html_table_of_custom_field_values($id, 'design', $fvalue, null, $tplan_id, $tprojectID, $st->cfieldFormatting, $tcInfo['id']);
        }
        if (!is_null($exec_info)) {
            $cfields['execScope'] = $tc_mgr->html_table_of_custom_field_values($tcInfo['id'], 'execution', null, $exec_info[0]['execution_id'], $tplan_id, $tprojectID, $st->cfieldFormatting);
        }
    }
    if ($options['toc']) {
        // EXTERNAL ID added
        $options['tocCode'] .= '<p style="padding-left: ' . 15 * $level . 'px;"><a href="#' . prefixToHTMLID('tc' . $id) . '">' . htmlspecialchars($external_id) . ": " . $name . '</a></p>';
        $code .= '<a name="' . prefixToHTMLID('tc' . $id) . '"></a>';
    }
    $code .= '<p>&nbsp;</p><div> <table class="tc" width="90%" ' . $st->table_style . '>';
    $code .= '<tr><th colspan="' . $cfg['tableColspan'] . '">' . $labels['test_case'] . " " . htmlspecialchars($external_id) . ": " . $name;
    // add test case version
    switch ($env->reportType) {
        case DOC_TEST_PLAN_DESIGN:
            $version_number = isset($node['version']) ? $node['version'] : $tcInfo['version'];
            break;
        case DOC_TEST_PLAN_EXECUTION:
        case DOC_TEST_PLAN_EXECUTION_ON_BUILD:
            $version_number = $tcInfo['version'];
            break;
        default:
            $version_number = $tcInfo['version'];
            break;
    }
    if ($cfg['doc']->tc_version_enabled || $force['displayVersion']) {
        $code .= '&nbsp;<span style="font-size: 80%;">' . $cfg['gui']->role_separator_open . $labels['version'] . $cfg['gui']->title_separator_1 . $version_number . $cfg['gui']->role_separator_close . '</span>';
    }
    $code .= "</th></tr>\n";
    if ($options['author']) {
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['author'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">' . gendocGetUserName($db, $tcInfo['author_id']);
        if (isset($options['displayDates']) && $options['displayDates']) {
            $dummy = null;
            $code .= ' - ' . localize_dateOrTimeStamp(null, $dummy, 'timestamp_format', $tcInfo['creation_ts']);
        }
        $code .= "</td></tr>\n";
        if ($tcInfo['updater_id'] > 0) {
            // add updater if available and differs from author OR forced
            if ($force['displayLastEdit'] > 0 || $tcInfo['updater_id'] != $tcInfo['author_id']) {
                $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['last_edit'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">' . gendocGetUserName($db, $tcInfo['updater_id']);
                if (isset($options['displayDates']) && $options['displayDates']) {
                    $dummy = null;
                    $code .= ' - ' . localize_dateOrTimeStamp(null, $dummy, 'timestamp_format', $tcInfo['modification_ts']);
                }
                $code .= "</td></tr>\n";
            }
        }
    }
    if ($options['body'] || $options['summary']) {
        $tcase_pieces = array('summary');
    }
    if ($options['body']) {
        $tcase_pieces[] = 'preconditions';
    }
    if ($options['body'] || $options['step_exec_notes'] || $options['step_exec_status']) {
        $tcase_pieces[] = 'steps';
    }
    if (!is_null($tcase_pieces)) {
        // Check user rights in order to understand if can delete attachments here
        //   function hasRight(&$db,$roleQuestion,$tprojectID = null,$tplanID = null,$getAccess=false)
        // $tplan_id = isset($context['tplan_id']) ? $context['tplan_id'] : 0;
        // $tprojectID = isset($context['tproject_id']) ? $context['tproject_id'] : 0;
        $canManageAttachments = false;
        if (isset($context['user']) && !is_null($context['user'])) {
            $canManageAttachments = $context['user']->hasRight($db, 'testplan_execute', $tprojectID, $tplan_id);
        }
        // Multiple Test Case Steps Feature
        foreach ($tcase_pieces as $key) {
            if ($key == 'steps') {
                if (isset($cfields['specScope']['before_steps_results'])) {
                    $code .= $cfields['specScope']['before_steps_results'];
                }
                if (!is_null($tcInfo[$key]) && $tcInfo[$key] != '') {
                    $td_colspan = 3;
                    $code .= '<tr>' . '<td><span class="label">' . $labels['step_number'] . ':</span></td>' . '<td><span class="label">' . $labels['step_actions'] . ':</span></td>' . '<td><span class="label">' . $labels['expected_results'] . ':</span></td>';
                    $sxni = null;
                    if ($opt['step_exec_notes'] || $opt['step_exec_status']) {
                        $sxni = $tc_mgr->getStepsExecInfo($exec_info[0]['execution_id']);
                        if ($opt['step_exec_notes']) {
                            $td_colspan++;
                            $code .= '<td><span class="label">' . $labels['step_exec_notes'] . ':</span></td>';
                        }
                        if ($opt['step_exec_status']) {
                            $td_colspan++;
                            $code .= '<td><span class="label">' . $labels['step_exec_status'] . ':</span></td>';
                        }
                    }
                    $code .= '</tr>';
                    $loop2do = count($tcInfo[$key]);
                    for ($ydx = 0; $ydx < $loop2do; $ydx++) {
                        $code .= '<tr>' . '<td width="5">' . $tcInfo[$key][$ydx]['step_number'] . '</td>' . '<td>' . $tcInfo[$key][$ydx]['actions'] . '</td>' . '<td>' . $tcInfo[$key][$ydx]['expected_results'] . '</td>';
                        $nike = !is_null($sxni) && isset($sxni[$tcInfo[$key][$ydx]['id']]) && !is_null($sxni[$tcInfo[$key][$ydx]['id']]);
                        if ($opt['step_exec_notes']) {
                            $code .= '<td>';
                            if ($nike) {
                                $code .= $sxni[$tcInfo[$key][$ydx]['id']]['notes'];
                            }
                            $code .= '</td>';
                        }
                        if ($opt['step_exec_status']) {
                            $code .= '<td>';
                            if ($nike) {
                                $code .= $statusL10N[$sxni[$tcInfo[$key][$ydx]['id']]['status']];
                            }
                            $code .= '</td>';
                        }
                        $code .= '</tr>';
                        // Attachment management
                        if ($getExecutions) {
                            if (isset($sxni[$tcInfo[$key][$ydx]['id']])) {
                                $attachInfo = getAttachmentInfos($docRepo, $sxni[$tcInfo[$key][$ydx]['id']]['id'], $tables['execution_tcsteps'], true, 1);
                                if (!is_null($attachInfo)) {
                                    $code .= '<tr><td colspan="' . $td_colspan . '">';
                                    $code .= '<b>' . $labels['exec_attachments'] . '</b><br>';
                                    foreach ($attachInfo as $fitem) {
                                        $code .= '<form method="POST" name="fda' . $fitem['id'] . '" ' . ' id="fda' . $fitem['id'] . "' " . ' action="' . $env->base_href . 'lib/execute/execPrint.php">';
                                        $code .= '<input type="hidden" name="id" value="' . intval($context['exec_id']) . '">';
                                        $code .= '<input type="hidden" name="deleteAttachmentID" value="' . intval($fitem['id']) . '">';
                                        if ($fitem['is_image']) {
                                            $code .= "<li>" . htmlspecialchars($fitem['file_name']) . "</li>";
                                            $code .= '<li>' . '<img src="' . $env->base_href . 'lib/attachments/attachmentdownload.php?skipCheck=1&id=' . $fitem['id'] . '">';
                                        } else {
                                            $code .= '<li>' . '<a href="' . $env->base_href . 'lib/attachments/attachmentdownload.php?skipCheck=1&id=' . $fitem['id'] . '" ' . ' target="#blank" > ' . htmlspecialchars($fitem['file_name']) . '</a>';
                                        }
                                        $code .= '<input type="image" alt="' . $labels['alt_delete_attachment'] . '"' . 'src="' . $env->base_href . TL_THEME_IMG_DIR . 'trash.png"></li></form>';
                                    }
                                    $code .= '</td></tr>';
                                }
                            }
                        }
                        // $getExecutions
                    }
                }
            } else {
                // disable the field if it's empty
                if ($tcInfo[$key] != '') {
                    $code .= '<tr><td colspan="' . $cfg['tableColspan'] . '"><span class="label">' . $labels[$key] . ':</span><br />' . $tcInfo[$key] . "</td></tr>";
                }
            }
        }
    }
    $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['execution_type'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">';
    // This is what have been choosen DURING DESIGN, but may be we can choose at DESIGN
    // manual and the execute AUTO, or may be choose AUTO and execute MANUAL.
    // After report on MANTIS, seems that we need to provide in output two values:
    // DESIGN execution type
    // EXECUTION execution type
    switch ($tcInfo['execution_type']) {
        case TESTCASE_EXECUTION_TYPE_AUTO:
            $code .= $labels['execution_type_auto'];
            break;
        case TESTCASE_EXECUTION_TYPE_MANUAL:
        default:
            $code .= $labels['execution_type_manual'];
            break;
    }
    $code .= "</td></tr>\n";
    //
    $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['estimated_execution_duration'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">' . $tcInfo['estimated_exec_duration'];
    $code .= "</td></tr>\n";
    if (isset($options['importance']) && $options['importance']) {
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['importance'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">' . $cfg['importance'][$tcInfo['importance']];
        $code .= "</td></tr>\n";
    }
    // print priority when printing test plan
    if (isset($options['priority']) && $options['priority']) {
        // Get priority of this tc version for this test plan by using testplanUrgency class.
        // Is there maybe a better method than this one?
        $filters = array('tcversion_id' => $tcInfo['id']);
        $opt = array('details' => 'tcversion');
        $prio_info = $tplan_urgency->getPriority($tplan_id, $filters, $opt);
        $prio = $prio_info[$tcInfo['id']]['priority_level'];
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['priority'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">' . $cfg['priority'][$prio];
        $code .= "</td></tr>\n";
    }
    // Spacer
    $code .= '<tr><td colspan="' . $cfg['tableColspan'] . '">' . "</td></tr>";
    $code .= $cfields['specScope']['standard_location'] . $cfields['execScope'];
    //
    $cfields = null;
    $prio_info = null;
    // $code = null;
    // 20140813
    $relSet = $tc_mgr->getRelations($id);
    if (!is_null($relSet['relations'])) {
        // $fx = str_repeat('&nbsp;',5); // MAGIC allowed
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top"><span class="label">' . $labels['relations'] . '</span></td>';
        $code .= '<td>';
        for ($rdx = 0; $rdx < $relSet['num_relations']; $rdx++) {
            if ($relSet['relations'][$rdx]['source_id'] == $id) {
                $ak = 'source_localized';
            } else {
                $ak = 'destination_localized';
            }
            $code .= htmlspecialchars($relSet['relations'][$rdx][$ak]) . ' - ' . htmlspecialchars($relSet['relations'][$rdx]['related_tcase']['fullExternalID']) . ':' . htmlspecialchars($relSet['relations'][$rdx]['related_tcase']['name']) . '<br>';
        }
        $code .= '</td></tr>';
    }
    $relSet = null;
    // collect REQ for TC
    if ($options['requirement']) {
        $requirements = $req_mgr->get_all_for_tcase($id);
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top"><span class="label">' . $labels['reqs'] . '</span>';
        $code .= '<td colspan="' . ($cfg['tableColspan'] - 1) . '">';
        if (sizeof($requirements)) {
            foreach ($requirements as $req) {
                $code .= htmlspecialchars($req['req_doc_id'] . ":  " . $req['title']) . "<br />";
            }
        } else {
            $code .= '&nbsp;' . $labels['none'] . '<br />';
        }
        $code .= "</td></tr>\n";
    }
    $requirements = null;
    // collect keywords for TC
    if ($options['keyword']) {
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top"><span class="label">' . $labels['keywords'] . ':</span>';
        $code .= '<td colspan="' . ($cfg['tableColspan'] - 1) . '">';
        $kwSet = $tc_mgr->getKeywords($id, null, array('fields' => 'keyword_id,keywords.keyword'));
        if (sizeof($kwSet)) {
            foreach ($kwSet as $kw) {
                $code .= htmlspecialchars($kw['keyword']) . "<br />";
            }
        } else {
            $code .= '&nbsp;' . $labels['none'] . '<br>';
        }
        $code .= "</td></tr>\n";
    }
    $kwSet = null;
    // Attachments
    $attachSet = (array) $tc_mgr->getAttachmentInfos($id);
    if (count($attachSet) > 0) {
        $code .= '<tr><td> <span class="label">' . $labels['attached_files'] . '</span></td>';
        $code .= '<td colspan="' . ($cfg['tableColspan'] - 2) . '"><ul>';
        foreach ($attachSet as $item) {
            $fname = "";
            if ($item['title']) {
                $fname .= htmlspecialchars($item['title']) . " : ";
            }
            $fname .= htmlspecialchars($item['file_name']);
            $code .= "<li>{$fname}</li>";
            if ($item['is_image']) {
                $code .= '<li>' . '<img src="' . $env->base_href . 'lib/attachments/attachmentdownload.php?skipCheck=1&id=' . $item['id'] . '"> </li>';
            } else {
                $code .= '<li>' . '<a href="' . $env->base_href . 'lib/attachments/attachmentdownload.php?skipCheck=1&id=' . $item['id'] . '" ' . ' target="#blank" > ' . htmlspecialchars($item['file_name']) . '</a></li>';
            }
        }
        $code .= "</ul></td></tr>";
    }
    $attachSet = null;
    // generate test results data for test report
    if ($options['passfail']) {
        $tsp = $cfg['tableColspan'] - 1;
        $code .= '<tr style="' . "font-weight: bold;background: #EEE;text-align: left;" . '">' . '<td width="' . $cfg['firstColWidth'] . '" valign="top">' . $labels['execution_details'] . '</td>' . '<td colspan="' . $tsp . '">' . "&nbsp;" . "</b></td></tr>\n";
        $bn = '';
        switch ($env->reportType) {
            case DOC_TEST_PLAN_EXECUTION_ON_BUILD:
                $ib = $build_mgr->get_by_id($build_id);
                $bn = htmlspecialchars($ib['name']);
                break;
            case DOC_TEST_PLAN_EXECUTION:
                if ($exec_info) {
                    $bn = htmlspecialchars($exec_info[0]['build_name']);
                }
                break;
        }
        if ($bn != '') {
            $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . $labels['build'] . '</td>' . '<td ' . $tsp . '>' . $bn . "</b></td></tr>\n";
        }
        if (isset($node['assigned_to'])) {
            $crew = explode(',', $node['assigned_to']);
            $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . $labels['assigned_to'] . '</td>' . '<td colspan="' . $tsp . '">';
            $xdx = 0;
            foreach ($crew as $mm) {
                if ($xdx != 0) {
                    $code .= ',';
                }
                $xdx = -1;
                echo $mm . '<br>';
                $code .= gendocGetUserName($db, $mm);
            }
            $code .= "</td></tr>\n";
        }
        if ($exec_info) {
            $settings['cfg'] = $cfg;
            $settings['lbl'] = $labels;
            $settings['opt'] = array('show_notes' => $options['notes']);
            $settings['colspan'] = $cfg['tableColspan'] - 1;
            $code .= buildTestExecResults($db, $its, $exec_info, $settings, $buildCfields);
            // Get Execution Attachments
            $execAttachInfo = getAttachmentInfos($docRepo, $exec_info[0]['execution_id'], $tables['executions'], true, 1);
            if (!is_null($execAttachInfo)) {
                $code .= '<tr><td colspan="' . $cfg['tableColspan'] . '">';
                $code .= '<b>' . $labels['exec_attachments'] . '</b><br>';
                foreach ($execAttachInfo as $fitem) {
                    if ($fitem['is_image']) {
                        $code .= "<li>" . htmlspecialchars($fitem['file_name']) . "</li>";
                        $code .= '<li>' . '<img src="' . $env->base_href . 'lib/attachments/attachmentdownload.php?skipCheck=1&id=' . $fitem['id'] . '"> </li>';
                    } else {
                        $code .= '<li>' . '<a href="' . $env->base_href . 'lib/attachments/attachmentdownload.php?skipCheck=1&id=' . $fitem['id'] . '" ' . ' target="#blank" > ' . htmlspecialchars($fitem['file_name']) . '</a></li>';
                    }
                }
                $code .= '</td></tr>';
            }
        } else {
            $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['report_exec_result'] . '</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '"><b>' . $labels["test_status_not_run"] . "</b></td></tr>\n";
        }
        $execAttachInfo = null;
        $exec_info = null;
    }
    $code .= "</table>\n</div>\n";
    return $code;
}
Example #9
0
/**
 * render Test Case content for generated documents
 * 
 * @param $integer db DB connection identifier 
 * @return string generated html code
 *
 * @internal revisions
 */
function renderTestCaseForPrinting(&$db, &$node, &$options, $env, $context)
{
    static $req_mgr;
    static $tc_mgr;
    static $build_mgr;
    static $tplan_mgr;
    static $tplan_urgency;
    static $labels;
    static $tcase_prefix;
    static $userMap = array();
    static $cfg;
    static $locationFilters;
    static $tables = null;
    static $force = null;
    static $bugInterfaceOn = false;
    static $its;
    static $buildCfields;
    static $statusL10N;
    $code = null;
    $tcInfo = null;
    $tcResultInfo = null;
    $tcase_pieces = null;
    $id = $node['id'];
    $level = $context['level'];
    $prefix = isset($context['prefix']) ? $context['prefix'] : null;
    $tplan_id = isset($context['tplan_id']) ? $context['tplan_id'] : 0;
    $tprojectID = isset($context['tproject_id']) ? $context['tproject_id'] : 0;
    $platform_id = isset($context['platform_id']) ? $context['platform_id'] : 0;
    $build_id = isset($context['build_id']) ? $context['build_id'] : 0;
    // init static elements
    if (!$tables) {
        $tables = tlDBObject::getDBTables(array('executions', 'builds'));
        $tc_mgr = new testcase($db);
        $tplan_urgency = new testPlanUrgency($db);
        $build_mgr = new build_mgr($db);
        $tplan_mgr = new testplan($db);
        list($cfg, $labels) = initRenderTestCaseCfg($tc_mgr, $options);
        if (!is_null($prefix)) {
            $tcase_prefix = $prefix;
        } else {
            list($tcase_prefix, $dummy) = $tc_mgr->getPrefix($id);
        }
        $tcase_prefix .= $cfg['testcase']->glue_character;
        $force['displayVersion'] = isset($options['displayVersion']) ? $options['displayVersion'] : false;
        $force['displayLastEdit'] = isset($options['displayLastEdit']) ? $options['displayLastEdit'] : false;
        $its = null;
        $tproject_mgr = new testproject($db);
        $info = $tproject_mgr->get_by_id($tprojectID);
        $bugInterfaceOn = $info['issue_tracker_enabled'];
        if ($info['issue_tracker_enabled']) {
            $it_mgr = new tlIssueTracker($db);
            $its = $it_mgr->getInterfaceObject($tprojectID);
            unset($it_mgr);
        }
        $statusL10N = null;
        foreach ($cfg['results']['code_status'] as $vc => $vstat) {
            if (isset($cfg['results']['status_label_for_exec_ui'][$vstat])) {
                $statusL10N[$vc] = lang_get($cfg['results']['status_label_for_exec_ui'][$vstat]);
            }
        }
    }
    $cspan = ' colspan = "' . ($cfg['tableColspan'] - 1) . '" ';
    $cfieldFormatting = array('label_css_style' => '', 'add_table' => false, 'value_css_style' => $cspan);
    /** 
     * @TODO THIS IS NOT THE WAY TO DO THIS IS ABSOLUTELY WRONG AND MUST BE REFACTORED, 
     * using existent methods - franciscom - 20090329 
     * Need to get CF with execution scope
     */
    $exec_info = null;
    $getExecutions = false;
    $getByID['filters'] = null;
    switch ($options["docType"]) {
        case DOC_TEST_SPEC:
            $getByID['tcversion_id'] = testcase::LATEST_VERSION;
            break;
        case SINGLE_TESTCASE:
            $getByID['tcversion_id'] = $node['tcversion_id'];
            $getExecutions = $options['cfields'] || $options['passfail'] || $options['notes'] || $options['step_exec_notes'] || $options['step_exec_status'];
            break;
        default:
            $getByID['tcversion_id'] = $node['tcversion_id'];
            $getExecutions = $options['cfields'] || $options['passfail'] || $options['notes'] || $options['step_exec_notes'] || $options['step_exec_status'];
            break;
    }
    if ($getExecutions) {
        // Thanks to Evelyn from Cortado, have found a very old issue never reported.
        // 1. create TC-1A VERSION 1
        // 2. add to test plan and execute FAILED ON BUILD 1
        // 3. Request Test Report (Test Plan EXECUTION REPORT).
        //    You will get spec for VERSION 1 and result for VERSION 1 - OK cool!
        // 4. create VERSION 2
        // 5. update linked Test Case Versions
        // 6. do nothing more than repeat step 3
        //    without this fix you will get
        //    You will get spec for VERSION 2 and result for VERSION 1 - Hmmm
        //    and in addition is not clear that execution was on VERSION 1 . No GOOD!!
        //
        // HOW has been fixed ?
        // Getting info about THE CURRENT LINKED test case version and looking for
        // exec info for this.
        //
        // ATTENTION: THIS IS OK ONLY WHEN BUILD ID is not provided
        //
        //
        // Get Linked test case version
        $linkedItem = $tplan_mgr->getLinkInfo($tplan_id, $id, $platform_id);
        $sql = " SELECT E.id AS execution_id, E.status, E.execution_ts, E.tester_id," . " E.notes, E.build_id, E.tcversion_id,E.tcversion_number,E.testplan_id," . " B.name AS build_name,E.execution_duration " . " FROM {$tables['executions']} E, {$tables['builds']} B" . " WHERE E.build_id = B.id " . " AND E.testplan_id = " . intval($tplan_id) . " AND E.platform_id = " . intval($platform_id) . " AND E.tcversion_id = " . intval($linkedItem[0]['tcversion_id']);
        if ($build_id > 0) {
            $sql .= " AND E.build_id = " . intval($build_id);
        } else {
            // We are looking for LATEST EXECUTION of CURRENT LINKED test case version
            $sql .= " AND E.tcversion_number=" . intval($linkedItem[0]['version']);
        }
        $sql .= " ORDER BY execution_id DESC";
        $exec_info = $db->get_recordset($sql, null, 1);
        $getByID['tcversion_id'] = $linkedItem[0]['tcversion_id'];
        $getByID['filters'] = null;
        if (!is_null($exec_info)) {
            //
            $getByID['tcversion_id'] = null;
            $getByID['filters'] = array('version_number' => $exec_info[0]['tcversion_number']);
            if ($options['build_cfields']) {
                if (!isset($buildCfields[$exec_info[0]['build_id']])) {
                    $buildCfields[$exec_info[0]['build_id']] = $build_mgr->html_table_of_custom_field_values($exec_info[0]['build_id'], $tprojectID);
                }
            }
        }
    }
    $tcInfo = $tc_mgr->get_by_id($id, $getByID['tcversion_id'], $getByID['filters'], array('renderGhost' => true));
    if ($tcInfo) {
        $tcInfo = $tcInfo[0];
    }
    $external_id = $tcase_prefix . $tcInfo['tc_external_id'];
    $name = htmlspecialchars($node['name']);
    $versionID = $tcInfo['id'];
    $cfields = array('specScope' => null, 'execScope' => null);
    if ($options['cfields']) {
        if (!$locationFilters) {
            $locationFilters = $tc_mgr->buildCFLocationMap();
        }
        // Get custom fields that has specification scope
        // Custom Field values at Test Case VERSION Level
        foreach ($locationFilters as $fkey => $fvalue) {
            $cfields['specScope'][$fkey] = $tc_mgr->html_table_of_custom_field_values($id, 'design', $fvalue, null, $tplan_id, $tprojectID, $cfieldFormatting, $tcInfo['id']);
        }
        if (!is_null($exec_info)) {
            $execution_id = $exec_info[0]['execution_id'];
            $cfields['execScope'] = $tc_mgr->html_table_of_custom_field_values($versionID, 'execution', null, $execution_id, $tplan_id, $tprojectID, $cfieldFormatting);
        }
    }
    if ($options['toc']) {
        // EXTERNAL ID added
        $options['tocCode'] .= '<p style="padding-left: ' . 15 * $level . 'px;"><a href="#' . prefixToHTMLID('tc' . $id) . '">' . htmlspecialchars($external_id) . ": " . $name . '</a></p>';
        $code .= '<a name="' . prefixToHTMLID('tc' . $id) . '"></a>';
    }
    // change table style in case of single TC printing to not be indented
    $table_style = "";
    if (isset($options['docType']) && $options['docType'] == SINGLE_TESTCASE) {
        $table_style = 'style="margin-left: 0;"';
    }
    $code .= '<p>&nbsp;</p><div> <table class="tc" width="90%" ' . $table_style . '>';
    $code .= '<tr><th colspan="' . $cfg['tableColspan'] . '">' . $labels['test_case'] . " " . htmlspecialchars($external_id) . ": " . $name;
    // add test case version
    switch ($env->reportType) {
        case DOC_TEST_PLAN_DESIGN:
            $version_number = $node['version'];
            break;
        case DOC_TEST_PLAN_EXECUTION:
        case DOC_TEST_PLAN_EXECUTION_ON_BUILD:
            $version_number = $tcInfo['version'];
            break;
        default:
            $version_number = $tcInfo['version'];
            break;
    }
    if ($cfg['doc']->tc_version_enabled || $force['displayVersion']) {
        $code .= '&nbsp;<span style="font-size: 80%;">' . $cfg['gui']->role_separator_open . $labels['version'] . $cfg['gui']->title_separator_1 . $version_number . $cfg['gui']->role_separator_close . '</span>';
    }
    $code .= "</th></tr>\n";
    if ($options['author']) {
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['author'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">' . gendocGetUserName($db, $tcInfo['author_id']);
        if (isset($options['displayDates']) && $options['displayDates']) {
            $dummy = null;
            $code .= ' - ' . localize_dateOrTimeStamp(null, $dummy, 'timestamp_format', $tcInfo['creation_ts']);
        }
        $code .= "</td></tr>\n";
        if ($tcInfo['updater_id'] > 0) {
            // add updater if available and differs from author OR forced
            if ($force['displayLastEdit'] > 0 || $tcInfo['updater_id'] != $tcInfo['author_id']) {
                $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['last_edit'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">' . gendocGetUserName($db, $tcInfo['updater_id']);
                if (isset($options['displayDates']) && $options['displayDates']) {
                    $dummy = null;
                    $code .= ' - ' . localize_dateOrTimeStamp(null, $dummy, 'timestamp_format', $tcInfo['modification_ts']);
                }
                $code .= "</td></tr>\n";
            }
        }
    }
    if ($options['body'] || $options['summary']) {
        $tcase_pieces = array('summary');
    }
    if ($options['body']) {
        $tcase_pieces[] = 'preconditions';
    }
    if ($options['body'] || $options['step_exec_notes'] || $options['step_exec_status']) {
        $tcase_pieces[] = 'steps';
    }
    if (!is_null($tcase_pieces)) {
        // Multiple Test Case Steps Feature
        foreach ($tcase_pieces as $key) {
            if ($key == 'steps') {
                if (isset($cfields['specScope']['before_steps_results'])) {
                    $code .= $cfields['specScope']['before_steps_results'];
                }
                if ($tcInfo[$key] != '') {
                    $code .= '<tr>' . '<td><span class="label">' . $labels['step_number'] . ':</span></td>' . '<td><span class="label">' . $labels['step_actions'] . ':</span></td>' . '<td><span class="label">' . $labels['expected_results'] . ':</span></td>';
                    if ($options['step_exec_notes'] || $options['step_exec_status']) {
                        $sxni = $tc_mgr->getStepsExecInfo($exec_info[0]['execution_id']);
                        if ($options['step_exec_notes']) {
                            $code .= '<td><span class="label">' . $labels['step_exec_notes'] . ':</span></td>';
                        }
                        if ($options['step_exec_status']) {
                            $code .= '<td><span class="label">' . $labels['step_exec_status'] . ':</span></td>';
                        }
                    }
                    $code .= '</tr>';
                    $loop2do = count($tcInfo[$key]);
                    for ($ydx = 0; $ydx < $loop2do; $ydx++) {
                        $code .= '<tr>' . '<td width="5">' . $tcInfo[$key][$ydx]['step_number'] . '</td>' . '<td>' . $tcInfo[$key][$ydx]['actions'] . '</td>' . '<td>' . $tcInfo[$key][$ydx]['expected_results'] . '</td>';
                        if ($options['step_exec_notes']) {
                            $code .= '<td>' . $sxni[$tcInfo[$key][$ydx]['id']]['notes'] . '</td>';
                        }
                        if ($options['step_exec_status']) {
                            $code .= '<td>' . $statusL10N[$sxni[$tcInfo[$key][$ydx]['id']]['status']] . '</td>';
                        }
                        $code .= '</tr>';
                    }
                }
            } else {
                // disable the field if it's empty
                if ($tcInfo[$key] != '') {
                    $code .= '<tr><td colspan="' . $cfg['tableColspan'] . '"><span class="label">' . $labels[$key] . ':</span><br />' . $tcInfo[$key] . "</td></tr>";
                }
            }
        }
    }
    $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['execution_type'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">';
    switch ($tcInfo['execution_type']) {
        case TESTCASE_EXECUTION_TYPE_AUTO:
            $code .= $labels['execution_type_auto'];
            break;
        case TESTCASE_EXECUTION_TYPE_MANUAL:
        default:
            $code .= $labels['execution_type_manual'];
            break;
    }
    $code .= "</td></tr>\n";
    //
    $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['estimated_execution_duration'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">' . $tcInfo['estimated_exec_duration'];
    $code .= "</td></tr>\n";
    if (isset($options['importance']) && $options['importance']) {
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['importance'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">' . $cfg['importance'][$tcInfo['importance']];
        $code .= "</td></tr>\n";
    }
    // print priority when printing test plan
    if (isset($options['priority']) && $options['priority']) {
        // Get priority of this tc version for this test plan by using testplanUrgency class.
        // Is there maybe a better method than this one?
        $filters = array('tcversion_id' => $tcInfo['id']);
        $opt = array('details' => 'tcversion');
        $prio_info = $tplan_urgency->getPriority($tplan_id, $filters, $opt);
        $prio = $prio_info[$tcInfo['id']]['priority_level'];
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['priority'] . ':</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '">' . $cfg['priority'][$prio];
        $code .= "</td></tr>\n";
    }
    // Spacer
    $code .= '<tr><td colspan="' . $cfg['tableColspan'] . '">' . "</td></tr>";
    $code .= $cfields['specScope']['standard_location'] . $cfields['execScope'];
    // generate test results data for test report
    if ($options['passfail']) {
        if ($exec_info) {
            $code .= buildTestExecResults($db, $its, $cfg, $labels, $exec_info, $cfg['tableColspan'] - 1, $options['notes'], $buildCfields);
        } else {
            $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top">' . '<span class="label">' . $labels['last_exec_result'] . '</span></td>' . '<td colspan="' . ($cfg['tableColspan'] - 1) . '"><b>' . $labels["test_status_not_run"] . "</b></td></tr>\n";
        }
    }
    // collect REQ for TC
    if ($options['requirement']) {
        if (!$req_mgr) {
            $req_mgr = new requirement_mgr($db);
        }
        $requirements = $req_mgr->get_all_for_tcase($id);
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top"><span class="label">' . $labels['reqs'] . '</span>';
        $code .= '<td colspan="' . ($cfg['tableColspan'] - 1) . '">';
        if (sizeof($requirements)) {
            foreach ($requirements as $req) {
                $code .= htmlspecialchars($req['req_doc_id'] . ":  " . $req['title']) . "<br />";
            }
        } else {
            $code .= '&nbsp;' . $labels['none'] . '<br />';
        }
        $code .= "</td></tr>\n";
    }
    // collect keywords for TC
    if ($options['keyword']) {
        $code .= '<tr><td width="' . $cfg['firstColWidth'] . '" valign="top"><span class="label">' . $labels['keywords'] . ':</span>';
        $code .= '<td colspan="' . ($cfg['tableColspan'] - 1) . '">';
        $arrKeywords = $tc_mgr->getKeywords($id);
        if (sizeof($arrKeywords)) {
            foreach ($arrKeywords as $kw) {
                $code .= htmlspecialchars($kw['keyword']) . "<br />";
            }
        } else {
            $code .= '&nbsp;' . $labels['none'] . '<br>';
        }
        $code .= "</td></tr>\n";
    }
    // Attachments
    $attachSet = (array) $tc_mgr->getAttachmentInfos($id);
    if (count($attachSet) > 0) {
        $code .= "<tr><td><span class=\"label\">" . $labels['attached_files'] . "</span></td><td><ul>";
        foreach ($attachSet as $item) {
            $fname = "";
            if ($item['title']) {
                $fname .= htmlspecialchars($item['title']) . " : ";
            }
            $fname .= htmlspecialchars($item['file_name']);
            $code .= "<li>{$fname}</li>";
            if ($item['is_image']) {
                $code .= '<li>' . '<img src="' . $env->base_href . 'lib/attachments/attachmentdownload.php?skipCheck=1&id=' . $item['id'] . '"> </li>';
            }
        }
        $code .= "</ul></td></tr>";
    }
    $code .= "</table>\n</div>\n";
    return $code;
}
Example #10
0
function initializeGui(&$dbHandler, &$argsObj, &$cfgObj, &$tplanMgr, &$tcaseMgr, &$issueTracker)
{
    $buildMgr = new build_mgr($dbHandler);
    $platformMgr = new tlPlatform($dbHandler, $argsObj->tproject_id);
    $gui = new stdClass();
    $gui->showExternalAccessString = true;
    $gui->showImgInlineString = false;
    $gui->issueSummaryForStep = null;
    $gui->addIssueOp = null;
    $gui->allowStepAttachments = true;
    $gui->tlCanCreateIssue = !is_null($issueTracker) && method_exists($issueTracker, 'addIssue');
    $gui->remoteExecFeedback = $gui->user_feedback = '';
    $gui->tplan_id = $argsObj->tplan_id;
    $gui->tproject_id = $argsObj->tproject_id;
    $gui->build_id = $argsObj->build_id;
    $gui->platform_id = $argsObj->platform_id;
    $gui->loadExecDashboard = false;
    $gui->treeFormToken = $argsObj->treeFormToken;
    $gui->import_limit = TL_REPOSITORY_MAXFILESIZE;
    $gui->execStatusValues = createResultsMenu();
    $gui->execStatusValues[$cfgObj->tc_status['not_run']] = '';
    if (isset($gui->execStatusValues[$cfgObj->tc_status['all']])) {
        unset($gui->execStatusValues[$cfgObj->tc_status['all']]);
    }
    $gui->can_use_bulk_op = 0;
    $gui->exec_notes_editors = null;
    $gui->bulk_exec_notes_editor = null;
    $gui->req_details = null;
    $gui->attachmentInfos = null;
    $gui->bugs = null;
    $gui->other_exec_cfields = null;
    $gui->ownerDisplayName = null;
    $gui->editorType = $cfgObj->editorCfg['type'];
    $gui->filter_assigned_to = $argsObj->filter_assigned_to;
    $gui->tester_id = $argsObj->user_id;
    $gui->include_unassigned = $argsObj->include_unassigned;
    $gui->tpn_view_status = $argsObj->tpn_view_status;
    $gui->bn_view_status = $argsObj->bn_view_status;
    $gui->bc_view_status = $argsObj->bc_view_status;
    $gui->platform_notes_view_status = $argsObj->platform_notes_view_status;
    $gui->refreshTree = $argsObj->refreshTree;
    if (!$argsObj->statusSingle || current($argsObj->statusSingle) == $cfgObj->tc_status['not_run']) {
        $gui->refreshTree = 0;
    }
    $gui->map_last_exec_any_build = null;
    $gui->map_last_exec = null;
    // 20081122 - franciscom
    // Just for the records:
    // doing this here, we avoid to do on processTestSuite() and processTestCase(),
    // but absolutely this will not improve in ANY WAY perfomance, because we do not loop
    // over these two functions.
    $tprojectMgr = new testproject($dbHandler);
    $gui->tcasePrefix = $tprojectMgr->getTestCasePrefix($argsObj->tproject_id);
    $build_info = $buildMgr->get_by_id($argsObj->build_id);
    $gui->build_notes = $build_info['notes'];
    $gui->build_is_open = $build_info['is_open'] == 1 ? 1 : 0;
    $gui->execution_types = $tcaseMgr->get_execution_types();
    if ($argsObj->filter_assigned_to) {
        $userSet = tlUser::getByIds($dbHandler, array_values($argsObj->filter_assigned_to));
        if ($userSet) {
            foreach ($userSet as $key => $userObj) {
                $gui->ownerDisplayName[$key] = $userObj->getDisplayName();
            }
        }
    }
    // ------------------------------------------------------------------
    $dummy = $tplanMgr->get_builds_for_html_options($argsObj->tplan_id);
    $gui->build_name = isset($dummy[$argsObj->build_id]) ? $dummy[$argsObj->build_id] : '';
    $gui->build_div_title = lang_get('build') . ' ' . $gui->build_name;
    $gui->exec_mode = initializeExecMode($dbHandler, $cfgObj->exec_cfg, $argsObj->user, $argsObj->tproject_id, $argsObj->tplan_id);
    $gui->grants = initializeRights($dbHandler, $argsObj->user, $argsObj->tproject_id, $argsObj->tplan_id);
    $rs = $tplanMgr->get_by_id($argsObj->tplan_id);
    $gui->testplan_notes = $rs['notes'];
    $gui->testplan_div_title = lang_get('test_plan') . ' ' . $rs['name'];
    $argsObj->tplan_apikey = $rs['api_key'];
    // Important note:
    // custom fields for test plan can be edited ONLY on design, that's reason why we are using
    // scope = 'design' instead of 'execution'
    $gui->testplan_cfields = $tplanMgr->html_table_of_custom_field_values($argsObj->tplan_id, 'design', array('show_on_execution' => 1));
    $gui->build_cfields = $buildMgr->html_table_of_custom_field_values($argsObj->build_id, $argsObj->tproject_id, 'design', array('show_on_execution' => 1));
    $gui->history_on = manage_history_on($_REQUEST, $_SESSION, $cfgObj->exec_cfg, 'btn_history_on', 'btn_history_off', 'history_on');
    $gui->history_status_btn_name = $gui->history_on ? 'btn_history_off' : 'btn_history_on';
    $dummy = $platformMgr->getLinkedToTestplan($argsObj->tplan_id);
    $gui->has_platforms = !is_null($dummy) ? 1 : 0;
    $gui->platform_info['id'] = 0;
    $gui->platform_info['name'] = '';
    if (!is_null($argsObj->platform_id) && $argsObj->platform_id > 0) {
        $gui->platform_info = $platformMgr->getByID($argsObj->platform_id);
    }
    $gui->platform_div_title = lang_get('platform') . ' ' . $gui->platform_info['name'];
    $gui->issueTrackerIntegrationOn = $gui->tlCanCreateIssue = $gui->tlCanAddIssueNote = false;
    $gui->node_id = $argsObj->id;
    $gui->draw_save_and_exit = $argsObj->caller == 'tcAssignedToMe';
    $gui->issueTrackerCfg = new stdClass();
    $gui->issueTrackerCfg->bugSummaryMaxLength = 100;
    // MAGIC I'm sorry
    $gui->issueTrackerCfg->editIssueAttr = false;
    if (!is_null($issueTracker)) {
        if ($issueTracker->isConnected()) {
            $itsCfg = $issueTracker->getCfg();
            $gui->issueTrackerCfg->bugSummaryMaxLength = $issueTracker->getBugSummaryMaxLength();
            $gui->issueTrackerCfg->editIssueAttr = intval($itsCfg->userinteraction);
            $gui->issueTrackerIntegrationOn = true;
            $gui->accessToIssueTracker = lang_get('link_bts_create_bug') . "({$argsObj->itsCfg['issuetracker_name']})";
            $gui->createIssueURL = $issueTracker->getEnterBugURL();
            $gui->tlCanCreateIssue = method_exists($issueTracker, 'addIssue') && $issueTracker->canCreateViaAPI();
            $gui->tlCanAddIssueNote = method_exists($issueTracker, 'addNote');
        } else {
            $gui->user_feedback = lang_get('issue_tracker_integration_problems');
        }
    }
    // get matadata
    $gui->issueTrackerMetaData = null;
    if ($gui->issueTrackerCfg->editIssueAttr == 1) {
        $gui->issueTrackerMetaData = !is_null($issueTracker) ? getIssueTrackerMetaData($issueTracker) : null;
        $k2c = array('issueType', 'issuePriority', 'artifactVersion', 'artifactComponent');
        foreach ($k2c as $kj) {
            $gui->{$kj} = $argsObj->{$kj};
            $kx = $kj . 'ForStep';
            $gui->{$kx} = $argsObj->{$kx};
        }
    }
    return $gui;
}
new dBug("Number of testcase linked to test plan=" . $count_testcases);
// echo "<pre> testplan - get_linked_tcversions(\$tplan_id,\$tcase_id=null,\$keyword_id=0,\$executed=null,
//                                              \$assigned_to=null,\$exec_status=null,\$build_id=0,
//                                              \$cf_hash = null)";echo "</pre>";
//
echo "<pre> testplan - get_linked_tcversions(\$id,\$filters=null,\$options=null)";
echo "</pre>";
echo "<pre>            get_linked_tcversions({$tplan_id})";
echo "</pre>";
$linked_tcversions = $tplan_mgr->get_linked_tcversions($tplan_id);
new dBug($linked_tcversions);
// -------------------------------------------------------------------------------------------
echo "<hr><h2> Build Manager Class </h2>";
echo "<pre> build manager - constructor - build_mgr(&\$db)";
echo "</pre>";
$build_mgr = new build_mgr($db);
new dBug($build_mgr);
$all_builds = $tplan_mgr->get_builds($tplan_id);
$dummy = array_keys($all_builds);
$build_id = $dummy[0];
echo "<pre> build manager - get_by_id(\$id)";
echo "</pre>";
echo "<pre>                 get_by_id({$build_id})";
echo "</pre>";
$build_info = $build_mgr->get_by_id($build_id);
new dBug($build_info);
/*

// getKeywords($testproject_id,$keywordID = null)
$tplan_id=1;
echo "<pre> testplan - getKeywords(\$testproject_id,\$keywordID = null)";echo "</pre>";