function requirement_edit_assoc_tests($req_id, $session_records_name, $pc_covered_text_input_name)
{
    global $db;
    $tbl_req = REQ_TBL;
    $f_req_proj_id = $tbl_req . "." . REQ_PROJECT_ID;
    $f_req_id = $tbl_req . "." . REQ_ID;
    $f_req_filename = $tbl_req . "." . REQ_FILENAME;
    $tbl_test_req_assoc = TEST_REQ_ASSOC_TBL;
    $f_test_req_assoc_req_id = $tbl_test_req_assoc . "." . TEST_REQ_ASSOC_REQ_ID;
    $f_test_req_assoc_test_id = $tbl_test_req_assoc . "." . TEST_REQ_ASSOC_TEMPEST_TEST_ID;
    $f_test_req_assoc_covered = $tbl_test_req_assoc . "." . TEST_REQ_ASSOC_PERCENT_COVERED;
    $tbl_test = TEST_TBL;
    $f_test_name = $tbl_test . "." . TEST_NAME;
    $f_test_id = $tbl_test . "." . TEST_ID;
    $s_project_properties = session_get_project_properties();
    $project_id = $s_project_properties['project_id'];
    $test_ids = test_get_all_ids($project_id);
    foreach ($test_ids as $row) {
        $test_id = $row[TEST_ID];
        $q = "\tSELECT {$f_test_req_assoc_req_id}\n\t\t\t\tFROM {$tbl_test_req_assoc}\n\t\t\t\tWHERE {$f_test_req_assoc_req_id} = {$req_id}\n\t\t\t\t\tAND\t{$f_test_req_assoc_test_id} = {$test_id}";
        $rs = db_query($db, $q);
        $record_exists = db_num_rows($db, $rs);
        if (session_records_ischecked($session_records_name, $test_id)) {
            $pc_covered = session_validate_form_get_field($pc_covered_text_input_name . $test_id);
            if ($pc_covered == '') {
                $pc_covered = 0;
            }
            if (!$record_exists) {
                # Add new record
                $q = "\tINSERT INTO {$tbl_test_req_assoc}\n\t\t\t\t\t\t\t({$f_test_req_assoc_req_id}, {$f_test_req_assoc_test_id}, {$f_test_req_assoc_covered})\n\t\t\t\t\t\tVALUES\n\t\t\t\t\t\t\t({$req_id}, {$test_id}, '{$pc_covered}')";
            } else {
                # Update current record
                $q = "\tUPDATE {$tbl_test_req_assoc}\n\t\t\t\t\t\tSET\n\t\t\t\t\t\t\t{$f_test_req_assoc_covered} = '{$pc_covered}'\n\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t{$f_test_req_assoc_req_id} = {$req_id}\n\t\t\t\t\t\t\tAND {$f_test_req_assoc_test_id} = {$test_id}";
            }
        } else {
            if ($record_exists) {
                $q = "\tDELETE FROM {$tbl_test_req_assoc}\n\t\t\t\t\t\tWHERE {$f_test_req_assoc_req_id} = {$req_id}\n\t\t\t\t\t\t\tAND\t{$f_test_req_assoc_test_id} = {$test_id}";
            }
        }
        db_query($db, $q);
    }
}
function report_get_project_status($project_id, $release_id = null, $build_id = null, $testset_id = null)
{
    global $db;
    $tbl_release = RELEASE_TBL;
    $f_rel_id = $tbl_release . "." . RELEASE_ID;
    $f_rel_name = $tbl_release . "." . RELEASE_NAME;
    $f_project_id = $tbl_release . "." . RELEASE_PROJECT_ID;
    $tbl_build = BUILD_TBL;
    $f_build_id = $tbl_build . "." . BUILD_ID;
    $f_build_release_id = $tbl_build . "." . BUILD_REL_ID;
    # testsets
    $ts_tbl = TS_TBL;
    $ts_id = $ts_tbl . "." . TS_ID;
    $ts_name = $ts_tbl . "." . TS_NAME;
    $ts_status = $ts_tbl . "." . TS_STATUS;
    $ts_desc = $ts_tbl . "." . TS_DESCRIPTION;
    $ts_build_id = $ts_tbl . "." . TS_BUILD_ID;
    $ts_orderby = $ts_tbl . "." . TS_ORDERBY;
    $ts_archive = $ts_tbl . "." . TS_ARCHIVE;
    $ts_date_created = $ts_tbl . "." . TS_DATE_CREATED;
    $q = "\tSELECT\n\t\t\t\t{$ts_id}\n\t\t\tFROM {$ts_tbl}\n\t\t\tINNER JOIN {$tbl_build}\n\t\t\t\tON {$f_build_id} = {$ts_build_id}\n\t\t\tINNER JOIN {$tbl_release}\n\t\t\t\tON {$f_rel_id} = {$f_build_release_id}\n\t\t\tWHERE {$f_project_id} = {$project_id}";
    $testsets = db_fetch_array($db, db_query($db, $q));
    $test_count = 0;
    $passed_count = 0;
    $failed_count = 0;
    $awaiting_review_count = 0;
    $wip_count = 0;
    $not_running_count = 0;
    $not_started_count = 0;
    foreach ($testsets as $row_testset) {
        # number of tests
        $assoc_tbl = TEST_TS_ASSOC_TBL;
        $f_assoc_id = $assoc_tbl . "." . TEST_TS_ASSOC_ID;
        $f_assoc_ts_id = $assoc_tbl . "." . TEST_TS_ASSOC_TS_ID;
        $f_assoc_test_id = $assoc_tbl . "." . TEST_TS_ASSOC_TEST_ID;
        $f_status = $assoc_tbl . "." . TEST_TS_ASSOC_STATUS;
        $f_finished = $assoc_tbl . "." . TEST_TS_ASSOC_FINISHED;
        $f_assigned_to = $assoc_tbl . "." . TEST_TS_ASSOC_ASSIGNED_TO;
        $f_comments = $assoc_tbl . "." . TEST_TS_ASSOC_COMMENTS;
        $q = "\tSELECT\n\t\t\t\t\t{$f_status},\n\t\t\t\t\tCOUNT({$f_status}) AS CountStatus\n\t\t\t\tFROM\n\t\t\t\t\t{$assoc_tbl}\n\t\t\t\tWHERE\n\t\t\t\t\t{$f_assoc_ts_id} = " . $row_testset[TS_ID] . "\n\t\t\t\tGROUP BY {$f_status}";
        $row_count_statuses = db_fetch_array($db, db_query($db, $q));
        foreach ($row_count_statuses as $row_count_status) {
            switch ($row_count_status[TEST_TS_ASSOC_STATUS]) {
                case "Passed":
                    $passed_count += $row_count_status["CountStatus"];
                    break;
                case "Failed":
                    $failed_count += $row_count_status["CountStatus"];
                    break;
                case "Finished: Awaiting Review":
                    $awaiting_review_count += $row_count_status["CountStatus"];
                    break;
                case "WIP":
                    $wip_count += $row_count_status["CountStatus"];
                    break;
                case "Not Running":
                    $not_running_count += $row_count_status["CountStatus"];
                    break;
                case "Not Started":
                    $not_started_count += $row_count_status["CountStatus"];
                    break;
            }
        }
        $test_count = sizeof(test_get_all_ids($project_id));
    }
    return array(sizeof($testsets), $test_count, $passed_count, $failed_count, $awaiting_review_count, $wip_count, $not_running_count, $not_started_count);
}