$log = new QuizAttempt();
$log->quiz = $id;
$log->score = $request->get('score');
- $log->passed = $request->get('passed')?'1':'0';
+ $log->passed = $request->get('passed') !== 'false' ? '1' : '0';
$log->answers = json_encode($request->get('questions'));
$log->save();
namespace App\Http\Controllers\Admin\Operations;
+use App\Models\Quiz;
+use App\Models\QuizAttempt;
use Cubist\Util\Files\Files;
use Illuminate\Support\Facades\Route;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
protected function report($id)
{
+ $quiz = Quiz::where('id', $id)->first()->getPageData();
+ $first = ['#', 'Date', 'Score', 'Passed'];
+
+ $emailQuestion = 0;
+
+ foreach ($quiz->questions as $q => $question) {
+ $first[] = $question['report_label'] ?: $question['question'];
+ if ($question['type'] === 'email') {
+ $emailQuestion = $q;
+ }
+ }
+
+ $attemptsList = [$first];
+ $users = [];
+ /** @var QuizAttempt[] $attempts */
+ $attempts = QuizAttempt::where('quiz', $id)->orderBy('created_at', 'ASC')->get();
+ foreach ($attempts as $attempt) {
+ $email = null;
+ $data = $attempt->getPageData();
+ $a = [$data->get('id'), $data->get('created_at'), $data->get('score'), $data->get('passed') ? '1' : '0'];
+ foreach ($data->get('answers', []) as $aid => $answer) {
+ if (null === $answer) {
+ continue;
+ }
+ $aa = $answer['anwser'] ?? $answer['answer'] ?? '';
+ if ($aid == $emailQuestion + 1) {
+ $email = trim(mb_strtolower($aa));
+ }
+ $a[] = is_array($aa) ? implode(', ', $aa) : $aa;
+ }
+
+ if (null !== $email) {
+ if (!isset($users[$email])) {
+ $users[$email] = ['totalAttempts' => 0, 'attemptsBeforePassing' => 0, 'passed' => false, 'worstScore' => 100, 'bestScore' => 0];
+ }
+ $users[$email]['totalAttempts']++;
+ $users[$email]['worstScore'] = min($users[$email]['worstScore'], $data->get('score'));
+ $users[$email]['bestScore'] = max($users[$email]['bestScore'], $data->get('score'));
+ if (!$users[$email]['passed']) {
+ $users[$email]['attemptsBeforePassing']++;
+ }
+ if ($data->get('passed')) {
+ $users[$email]['passed'] = true;
+ }
+ }
+
+ $attemptsList[] = $a;
+ }
+
+ $usersList = [['Email', 'Passed', 'Attempts before passed', 'Total attempts', 'Best score', 'Worst score']];
+ foreach ($users as $email => $user) {
+ $usersList[] = [$email, $user['passed'] ? '1' : '0', $user['attemptsBeforePassing'], $user['totalAttempts'], $user['bestScore'], $user['worstScore']];
+ }
+
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('USERS');
+ $sheet->fromArray($usersList);
+ foreach (range('A', 'Z') as $columnID) {
+ $sheet->getColumnDimension($columnID)->setAutoSize(true);
+ }
+ array_reverse($attemptsList);
$sheet = $spreadsheet->createSheet();
- $sheet->setTitle('DATA');
- $sheet->setCellValue('A1', 'Hello World !');
+ $sheet->setTitle('ATTEMPTS');
+ $sheet->fromArray($attemptsList);
+ foreach (range('A', 'Z') as $columnID) {
+ $sheet->getColumnDimension($columnID)->setAutoSize(true);
+ }
$writer = new Xlsx($spreadsheet);
$tmp = Files::tempnam();
'type' => 'Text',
'label' => 'Question label']);
+ $this->addField(['name' => 'report_label',
+ 'type' => 'Text',
+ 'label' => 'Question label in reports']);
+
$this->addField(['name' => 'type',
'type' => 'SelectFromArray',
'label' => 'Type',
"source": {
"type": "git",
"url": "git://git.cubedesigners.com/cubist_cms-back.git",
- "reference": "a93ca4e7089022c95cd738143fffb9cba3efe76f"
+ "reference": "b400e14d10f01ac02c5c16951bbb76b1682c2e36"
},
"dist": {
"type": "tar",
- "url": "https://composer.cubedesigners.com/dist/cubist/cms-back/cubist-cms-back-dev-master-3bc9cf.tar",
- "reference": "a93ca4e7089022c95cd738143fffb9cba3efe76f",
- "shasum": "2ee03d406892aaae9ac63910af4c7960e48e4265"
+ "url": "https://composer.cubedesigners.com/dist/cubist/cms-back/cubist-cms-back-dev-master-c7b202.tar",
+ "reference": "b400e14d10f01ac02c5c16951bbb76b1682c2e36",
+ "shasum": "bf4286cc83661561acb996d042339510fe84eec6"
},
"require": {
"backpack/backupmanager": "^2.0",
}
],
"description": "Cubist Backpack extension",
- "time": "2020-10-08T17:54:21+00:00"
+ "time": "2020-10-12T17:54:04+00:00"
},
{
"name": "cubist/cms-front",
},
{
"name": "dragonmantank/cron-expression",
- "version": "v2.3.0",
+ "version": "v2.3.1",
"source": {
"type": "git",
"url": "https://github.com/dragonmantank/cron-expression.git",
- "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27"
+ "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27",
- "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/65b2d8ee1f10915efb3b55597da3404f096acba2",
+ "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2",
"shasum": ""
},
"require": {
- "php": "^7.0"
+ "php": "^7.0|^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^6.4|^7.0"
+ "phpunit/phpunit": "^6.4|^7.0|^8.0|^9.0"
},
"type": "library",
"extra": {
"cron",
"schedule"
],
- "time": "2019-03-31T00:38:28+00:00"
+ "time": "2020-10-13T00:52:37+00:00"
},
{
"name": "egulias/email-validator",
},
{
"name": "nesbot/carbon",
- "version": "2.41.2",
+ "version": "2.41.3",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "35959c93ada06469107a05df6b15b65074a960cf"
+ "reference": "e148788eeae9b9b7b87996520358b86faad37b52"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/35959c93ada06469107a05df6b15b65074a960cf",
- "reference": "35959c93ada06469107a05df6b15b65074a960cf",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e148788eeae9b9b7b87996520358b86faad37b52",
+ "reference": "e148788eeae9b9b7b87996520358b86faad37b52",
"shasum": ""
},
"require": {
"datetime",
"time"
],
- "time": "2020-10-10T23:35:06+00:00"
+ "time": "2020-10-12T20:36:09+00:00"
},
{
"name": "nothingworks/blade-svg",
},
{
"name": "composer/composer",
- "version": "1.10.13",
+ "version": "1.10.15",
"source": {
"type": "git",
"url": "https://github.com/composer/composer.git",
- "reference": "47c841ba3b2d3fc0b4b13282cf029ea18b66d78b"
+ "reference": "547c9ee73fe26c77af09a0ea16419176b1cdbd12"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/composer/zipball/47c841ba3b2d3fc0b4b13282cf029ea18b66d78b",
- "reference": "47c841ba3b2d3fc0b4b13282cf029ea18b66d78b",
+ "url": "https://api.github.com/repos/composer/composer/zipball/547c9ee73fe26c77af09a0ea16419176b1cdbd12",
+ "reference": "547c9ee73fe26c77af09a0ea16419176b1cdbd12",
"shasum": ""
},
"require": {
"dependency",
"package"
],
- "time": "2020-09-09T09:46:34+00:00"
+ "time": "2020-10-13T13:59:09+00:00"
},
{
"name": "composer/semver",
},
{
"name": "facade/ignition",
- "version": "2.3.8",
+ "version": "2.4.1",
"source": {
"type": "git",
"url": "https://github.com/facade/ignition.git",
- "reference": "e8fed9c382cd1d02b5606688576a35619afdf82c"
+ "reference": "9fc6c3d3de5271a1b94cff19dce2c9295abf0ffa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/facade/ignition/zipball/e8fed9c382cd1d02b5606688576a35619afdf82c",
- "reference": "e8fed9c382cd1d02b5606688576a35619afdf82c",
+ "url": "https://api.github.com/repos/facade/ignition/zipball/9fc6c3d3de5271a1b94cff19dce2c9295abf0ffa",
+ "reference": "9fc6c3d3de5271a1b94cff19dce2c9295abf0ffa",
"shasum": ""
},
"require": {
"laravel",
"page"
],
- "time": "2020-10-01T23:01:14+00:00"
+ "time": "2020-10-14T08:59:59+00:00"
},
{
"name": "facade/ignition-contracts",
var passed = checkScore();
if (logAttempts) {
- var logdata = {
- passed: passed,
- score: Math.round(100 * (score / countQuestions)),
- questions: logQuestions,
- };
-
- $.ajax('https://toolbox.fluidbook.com/quiz/' + $(data).find('id').text() + '/log',
- {
- method: 'POST',
- data: logdata,
- crossDomain: true,
- }
- );
+ logAttempt(passed);
}
}
+ function logAttempt(passed){
+ var logdata = {
+ passed: passed,
+ score: Math.round(100 * (score / countQuestions)),
+ questions: logQuestions,
+ };
+
+ $.ajax('https://toolbox.fluidbook.com/quiz/' + $(data).find('id').text() + '/log',
+ {
+ method: 'POST',
+ data: logdata,
+ crossDomain: true,
+ }
+ );
+ }
+
function checkScore() {
var normalizedScore = score / countQuestions;
$('#results > h2').hide();
});
ok = this_score >= min_score;
answers.push(a);
- log.anwser = a;
+ log.answer = a;
} else {
- log.anwser = $(this).find('input').val();
+ log.answer = $(this).find('input').val();
}
var b = $("#correction .correction[data-i='" + qn + "'] .badge");