function run_handler(&$RES, $test, $answered_question_id, $answer_id) { $t = DBkitModel::get("SELECT MAX(`order`) AS question_count FROM questions WHERE `test_id` = %d", $test->id); $question_count = $t->question_count; $action = next_action($RES, $question_count); if ($action == 'random') { $action = array(1, $question_count); } if ($action == 'next') { $action = $RES->question_ord + 1; } if (is_integer($action) && $action > $question_count) { $action = 'finish'; } $answered_question_ids = collect_attrs($RES->answers, 'question_id'); $id_cond = empty($answered_question_ids) ? "TRUE" : "`id` NOT IN ?"; if (is_integer($action)) { $t = DBkitModel::get("SELECT MIN(`order`) AS `order` FROM `questions` WHERE `test_id`=%d AND `order`>=%d AND {$id_cond}", $test->id, $action, $answered_question_ids); if (!$t) { // TODO: what to do when the question_ord returned by the handler does not exist? } $question = Question::get("WHERE `order` = %d AND `test_id` = %d LIMIT 1", $t->order, $test->id); } else { if (is_array($action)) { $t = DBkitModel::query("SELECT `id` FROM `questions` WHERE `test_id`=%d AND `order` BETWEEN %d AND %d AND {$id_cond}", $test->id, $action[0], $action[1], $answered_question_ids); if (empty($t)) { $action = 'finish'; } else { $t = $t[mt_rand(0, count($t) - 1)]; $question = Question::get("WHERE `id` = %d AND `test_id` = %d LIMIT 1", $t->id, $test->id); } } } if ($question) { $RES->question_id = $question->id; $RES->question_ord = $question->order; $RES->question_no++; if (!is_null($answered_question_id)) { stat_question_answered($RES->session_id, $test->id, $RES->partner_id, $RES->day, $answered_question_id, $answer_id, $RES->question_id, $RES->paid); } return $question; } if ($action == 'finish') { $RES->finished = true; if ($RES->paid) { $RES->sms_chal = random_string(REATESTER_SMS_CHAL_LENGTH); $RES->sms_resp = random_string(REATESTER_SMS_RESP_LENGTH); } else { $RES->sms_chal = $RES->sms_resp = null; } stat_test_finished($RES->session_id, $test->id, $RES->partner_id, $RES->day, $answered_question_id, $answer_id, $RES->paid, $RES->sms_chal, $RES->sms_resp); redirect("/tests/{$test->id}/"); die; } die("Internal error: invalid handler action '{$action}'"); }
<?php include '../lib/common.inc.php'; // $test = Test::get_from_request('index.php', "Извините, этот тест уже удален."); $title = "Статистика"; $sum = "SUM(`count_free_starts`) AS `count_free_starts`, SUM(`count_free_finishes`) AS `count_free_finishes`, SUM(`count_starts`) AS `count_starts`, SUM(`count_finishes`) AS `count_finishes`, SUM(`count_smses`) AS `count_smses`, SUM(`service_earning`) AS `service_earning`, SUM(`partner_earning`) AS `partner_earning`"; $daily_stats = DailyStatistics::query("SELECT `day`, {$sum} FROM _T_ WHERE `day` >= DATE_ADD(NOW(), INTERVAL -1 MONTH) GROUP BY `day` ORDER BY `day`"); $partner_stats = DailyStatistics::query("SELECT `partner_id`, {$sum} FROM _T_ WHERE `day` >= DATE_ADD(NOW(), INTERVAL -1 MONTH) GROUP BY `partner_id`"); $partners = Partner::query_indexed('id', "SELECT `id`, `email` FROM _T_ WHERE `id` IN ?", collect_attrs($partner_stats, 'partner_id')); foreach ($partner_stats as &$stat) { if (intval($stat->partner_id) == 0) { $stat->partner_email = "(нет)"; } else { $stat->partner_email = $partners[$stat->partner_id]->email; } } $test_stats = DailyStatistics::query("SELECT `test_id`, {$sum} FROM _T_ WHERE `day` >= DATE_ADD(NOW(), INTERVAL -1 MONTH) GROUP BY `test_id`"); $tests = Test::query_indexed('id', "SELECT `id`, `name` FROM _T_ WHERE `id` IN ?", collect_attrs($test_stats, 'test_id')); foreach ($test_stats as &$stat) { $stat->test_name = $tests[$stat->test_id]->name; } render('statistics.haml', array('test' => $test, 'daily_stats' => $daily_stats, 'partner_stats' => $partner_stats, 'test_stats' => $test_stats, 'tab' => 'statistics'));