142 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
require_once "GroupMgr.php";
 | 
						|
require_once "TestMgr.php";
 | 
						|
 | 
						|
require_once "common_func.php";
 | 
						|
 | 
						|
class ReportBuilder
 | 
						|
{
 | 
						|
    static private function getStatsByFilters(int $gameid, string $filter, string $groups, string $ordering)
 | 
						|
    {
 | 
						|
        $groupMgr = new GroupMgr();
 | 
						|
        $testMgr = new TestMgr();
 | 
						|
 | 
						|
        // get nicknames
 | 
						|
        $groups = explode_list($groups);
 | 
						|
        $nicknames = $groupMgr->getJoinedMembersByUniqueNames($groups);
 | 
						|
        $groupFilter = ["nickname", "IN", $nicknames];
 | 
						|
 | 
						|
        // get IDs
 | 
						|
        $tests = $testMgr->getResultsByGameId($gameid, $filter, $ordering, true, $groupFilter);
 | 
						|
        $ids = array_map(fn($test) => $test->getId(), $tests);
 | 
						|
 | 
						|
        // generate stats
 | 
						|
        return $testMgr->generateDetailedStats($gameid, $ids);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class Answer {
 | 
						|
    const CORRECT = "Correct";
 | 
						|
    const INCORRECT = "Incorrect";
 | 
						|
 | 
						|
    private string $text; // Answer's text
 | 
						|
    private string $type; // Answer's type
 | 
						|
    private float $ratio; // Answer's ratio
 | 
						|
 | 
						|
    public function __construct(string $type, string $text, float $ratio) {
 | 
						|
        $this->type = $type;
 | 
						|
        $this->text = $text;
 | 
						|
        $this->ratio = $ratio;
 | 
						|
    }
 | 
						|
 | 
						|
    // Convert answer into TeX format.
 | 
						|
    public function genTeX(): string {
 | 
						|
        return "\\answer" . $this->type . "{" . $this->ratio . "}{" .  $this->text . "}\n";
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class Challenge {
 | 
						|
    private string $question;
 | 
						|
    private array $answers;
 | 
						|
 | 
						|
    function __construct(array $data)
 | 
						|
    {
 | 
						|
        $this->question = $data["question"]; // store question
 | 
						|
        for ($i = 0; $i < count($data["answers"]); $i++) {
 | 
						|
            $answer = $data["answers"][$i];
 | 
						|
            $ratio = $data["answer_ratio"][$i];
 | 
						|
            $type = $answer === $data["correctAnswer"] ? Answer::CORRECT : Answer::INCORRECT;
 | 
						|
            $this->answers[] = new Answer($type, $answer, $ratio);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function getQuestion(): string {
 | 
						|
        return $this->question;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getAnswers(): array {
 | 
						|
        return $this->answers;
 | 
						|
    }
 | 
						|
 | 
						|
    // Generate TeX representation.
 | 
						|
    public function genTeX(): string {
 | 
						|
        $tex = "\\begin{question}{" . $this->question . "}\n";
 | 
						|
        foreach ($this->answers as $answer) {
 | 
						|
            $tex .= $answer->genTeX();
 | 
						|
        }
 | 
						|
        $tex .= "\\end{question}\n";
 | 
						|
        return $tex;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class ReportSection {
 | 
						|
    private string $title;
 | 
						|
    private array $challenges;
 | 
						|
    function __construct(string $title, array $stats) {
 | 
						|
        $this->stats = $stats;
 | 
						|
    }
 | 
						|
 | 
						|
    function getChallenges() : array {
 | 
						|
        return $this->challenges;
 | 
						|
    }
 | 
						|
 | 
						|
    function getTitle() : string {
 | 
						|
        return $this->title;
 | 
						|
    }
 | 
						|
 | 
						|
    // Generate TeX representation of this report.
 | 
						|
    function genTeX() : string {
 | 
						|
        $tex = "\\begin{quiz}{" . $this->title . "}\n";
 | 
						|
        foreach ($this->challenges as $challenge) {
 | 
						|
            $tex .= $challenge->genTeX();
 | 
						|
        }
 | 
						|
        $tex .= "\\end{quiz}\n";
 | 
						|
        return $tex;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class Report
 | 
						|
{
 | 
						|
    private string $title;
 | 
						|
    private array $sections;
 | 
						|
    function __construct(string $title)
 | 
						|
    {
 | 
						|
        $this->title = $title;
 | 
						|
        $this->sections = [];
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    // Add a new section to the report.
 | 
						|
    function addSection(ReportSection &$section) : void
 | 
						|
    {
 | 
						|
        $this->sections[] = $section;
 | 
						|
    }
 | 
						|
    
 | 
						|
    // Generate TeX representation.
 | 
						|
    function genTeX() :string
 | 
						|
    {
 | 
						|
        $tex = "";
 | 
						|
        foreach ($this->sections as $section) {
 | 
						|
            $tex .= $section->genTeX() . "\n\n";
 | 
						|
        }
 | 
						|
        return $tex;
 | 
						|
    }
 | 
						|
 | 
						|
    // Save TeX representation
 | 
						|
    function saveTeX(string $fileName) : void {
 | 
						|
        file_put_contents($fileName, $this->genTeX()); // TODO: cím!!!
 | 
						|
    }
 | 
						|
}
 | 
						|
 |