ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
AttemptOverview.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
23use ILIAS\Test\Results\Presentation\Settings as ResultPresentationSettings;
26use ILIAS\UI\Factory as UIFactory;
27use ILIAS\UI\Component\Listing\Descriptive as DescriptiveListing;
29
31{
32 public function __construct(
33 private readonly int $active_id,
34 private readonly int $attempt_id,
35 private readonly ResultPresentationSettings $settings,
36 private readonly string $exam_id = '',
37 private readonly float $reached_points = 0.0,
38 private readonly float $available_points = 0.0,
39 private readonly ?Mark $mark = null,
40 private readonly int $nr_of_answered_questions = 0,
41 private readonly int $nr_of_questions_in_attempt = 0,
42 private readonly int $time_on_task = 0,
43 private readonly int $total_time_on_task = 0,
44 private readonly ?\DateTimeImmutable $attempt_started_date = null,
45 private readonly ?\DateTimeImmutable $last_access = null,
46 private readonly int $nr_of_attempts = 0,
47 private readonly ?int $scored_attempt = null,
48 private readonly ?int $rank = 0,
49 private readonly StatusOfAttempt $status_of_attempt = StatusOfAttempt::NOT_YET_STARTED
50 ) {
51 }
52
53 public function getActiveId(): int
54 {
55 return $this->active_id;
56 }
57
58 public function getAttempt(): int
59 {
60 return $this->attempt_id;
61 }
62
63 public function getExamId(): string
64 {
65 return $this->exam_id;
66 }
67
68 public function getStartedDate(): ?\DateTimeImmutable
69 {
70 return $this->attempt_started_date;
71 }
72
73 public function getNrOfAnsweredQuestions(): int
74 {
75 return $this->nr_of_answered_questions;
76 }
77
78 public function getNrOfTotalQuestions(): int
79 {
80 return $this->nr_of_questions_in_attempt;
81 }
82
83 public function hasAnsweredQuestions(): bool
84 {
85 return $this->nr_of_answered_questions > 0;
86 }
87
88 public function getMark(): ?string
89 {
90 return $this->mark?->getShortName();
91 }
92
93 public function hasPassingMark(): bool
94 {
95 return $this->mark?->getPassed() ?? false;
96 }
97
98 public function getReachedPoints(): float
99 {
100 return $this->reached_points;
101 }
102
103 public function getAvailablePoints(): float
104 {
105 return $this->available_points;
106 }
107
108 public function getReachedPointsInPercent(): float
109 {
110 if ($this->reached_points === 0.0 || $this->available_points === 0.0) {
111 return 0.0;
112 }
113 return $this->reached_points / $this->available_points * 100;
114 }
115
117 {
118 return $this->status_of_attempt;
119 }
120
121 public function getNrOfAttempts(): int
122 {
123 return $this->nr_of_attempts;
124 }
125
126 public function getTotalTimeOnTask(): int
127 {
128 return $this->total_time_on_task;
129 }
130
131 public function getAsDescriptiveListing(
133 UIFactory $ui_factory,
134 array $environment
135 ): DescriptiveListing {
136 $items = [
137 $lng->txt('tst_stat_result_resultspoints') => $this->reached_points
138 . ' ' . strtolower($lng->txt('of')) . ' ' . $this->available_points
139 . ' (' . sprintf('%2.2f', $this->getReachedPointsInPercent()) . ' %)',
140 $lng->txt('tst_stat_result_resultsmarks') => $this->mark?->getShortName() ?? ''
141 ];
142
143 return $ui_factory->listing()->descriptive(
144 $items + [
145 $lng->txt('tst_stat_result_timeontask') => $this->buildHumanReadableTime($this->time_on_task),
146 $lng->txt('tst_stat_result_firstvisit') => $this->attempt_started_date
147 ?->setTimezone($environment['timezone'])
148 ->format($environment['datetimeformat']) ?? '',
149 $lng->txt('tst_stat_result_lastvisit') => $this->last_access
150 ?->setTimezone($environment['timezone'])
151 ->format($environment['datetimeformat']) ?? '',
152 $lng->txt('tst_nr_of_passes') => (string) $this->nr_of_attempts,
153 $lng->txt('scored_pass') => (string) ($this->scored_attempt + 1),
154 $lng->txt('tst_stat_result_rank_participant') => (string) $this->rank
155 ]
156 );
157 }
158
159 public function getHumanReadableTotalTimeOnTask(): string
160 {
161 return $this->buildHumanReadableTime($this->total_time_on_task);
162 }
163
164 private function buildHumanReadableTime(int $time): string
165 {
166 $diff_seconds = $time;
167 $diff_hours = floor($diff_seconds / 3600);
168 $diff_seconds -= $diff_hours * 3600;
169 $diff_minutes = floor($diff_seconds / 60);
170 $diff_seconds -= $diff_minutes * 60;
171 return sprintf("%02d:%02d:%02d", $diff_hours, $diff_minutes, $diff_seconds);
172 }
173}
Builds a Color from either hex- or rgb values.
Definition: Factory.php:31
getAsDescriptiveListing(Language $lng, UIFactory $ui_factory, array $environment)
__construct(private readonly int $active_id, private readonly int $attempt_id, private readonly ResultPresentationSettings $settings, private readonly string $exam_id='', private readonly float $reached_points=0.0, private readonly float $available_points=0.0, private readonly ?Mark $mark=null, private readonly int $nr_of_answered_questions=0, private readonly int $nr_of_questions_in_attempt=0, private readonly int $time_on_task=0, private readonly int $total_time_on_task=0, private readonly ?\DateTimeImmutable $attempt_started_date=null, private readonly ?\DateTimeImmutable $last_access=null, private readonly int $nr_of_attempts=0, private readonly ?int $scored_attempt=null, private readonly ?int $rank=0, private readonly StatusOfAttempt $status_of_attempt=StatusOfAttempt::NOT_YET_STARTED)
A class defining marks for assessment test objects.
Definition: Mark.php:36
global $lng
Definition: privfeed.php:31