ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilPRGAssignment.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
23 
29 {
31 
32  public const DATE_TIME_FORMAT = 'Y-m-d H:i:s';
33  public const DATE_FORMAT = 'Y-m-d';
34 
35  public const NO_RESTARTED_ASSIGNMENT = -1;
36 
37  public const AUTO_ASSIGNED_BY_ROLE = -1;
38  public const AUTO_ASSIGNED_BY_ORGU = -2;
39  public const AUTO_ASSIGNED_BY_COURSE = -3;
40  public const AUTO_ASSIGNED_BY_GROUP = -4;
41  public const AUTO_ASSIGNED_BY_RESTART = -5;
42 
43  protected int $id;
44  protected int $usr_id;
45  protected ?\DateTimeImmutable $last_change = null;
46  protected ?int $last_change_by = null;
47  protected ?\DateTimeImmutable$restart_date = null;
48  protected ?int $restarted_asssignment_id = self::NO_RESTARTED_ASSIGNMENT;
49  protected bool $manually_assigned;
53  protected array $progresses = [];
57 
58  public function __construct(int $id, int $usr_id)
59  {
60  $this->id = $id;
61  $this->usr_id = $usr_id;
62  $this->events = new PRGNullEvents();
63  }
64 
65  public function getId(): int
66  {
67  return $this->id;
68  }
69 
70  public function getUserId(): int
71  {
72  return $this->usr_id;
73  }
74 
75  public function getLastChangeBy(): int
76  {
77  return $this->last_change_by;
78  }
79 
80  public function getLastChange(): ?\DateTimeImmutable
81  {
82  return $this->last_change;
83  }
84 
85  public function withLastChange(
86  int $last_change_by,
87  \DateTimeImmutable $last_change
88  ): self {
89  if ($this->getLastChange()
90  && $this->getLastChange()->format(self::DATE_TIME_FORMAT) > $last_change->format(self::DATE_TIME_FORMAT)
91  ) {
92  throw new ilException(
93  "Cannot set last change to an earlier date:"
94  . "\ncurrent: " . $this->getLastChange()->format(self::DATE_TIME_FORMAT)
95  . "\nnew: " . $last_change,
96  1
97  );
98  }
99  $clone = clone $this;
100  $clone->last_change = $last_change;
101  $clone->last_change_by = $last_change_by;
102  return $clone;
103  }
104 
105  public function getRestartDate(): ?\DateTimeImmutable
106  {
107  return $this->restart_date;
108  }
109 
110  public function getRestartedAssignmentId(): int
111  {
113  }
114 
115  public function isRestarted(): bool
116  {
117  return $this->getRestartedAssignmentId() !== -1;
118  }
119 
120  public function withRestarted(
121  int $restarted_asssignment_id,
122  ?\DateTimeImmutable $restart_date = null
123  ): self {
124  $clone = clone $this;
125  $clone->restarted_asssignment_id = $restarted_asssignment_id;
126  $clone->restart_date = $restart_date;
127  return $clone;
128  }
129 
130  public function isManuallyAssigned(): bool
131  {
133  }
134 
135  public function withManuallyAssigned(bool $manual): self
136  {
137  $clone = clone $this;
138  $clone->manually_assigned = $manual;
139  return $clone;
140  }
141 
142  public function withUserInformation(ilPRGUserInformation $user_info): self
143  {
144  $clone = clone $this;
145  $clone->user_info = $user_info;
146  return $clone;
147  }
149  {
150  return $this->user_info;
151  }
152 
153 
154  public function withProgressTree(ilPRGProgress $progress): self
155  {
156  $clone = clone $this;
157  $clone->progress = $progress;
158  return $clone;
159  }
160  public function getProgressTree(): ilPRGProgress
161  {
162  return $this->progress;
163  }
164 
165  public function getRootId(): int
166  {
167  return $this->progress->getNodeId();
168  }
169 
170  public function getProgresses(array &$ret = [], ?ilPRGProgress $pgs = null): array
171  {
172  if (!$pgs) {
173  $pgs = $this->getProgressTree();
174  }
175 
176  $ret[] = $pgs;
177  foreach ($pgs->getSubnodes() as $id => $sub) {
178  $this->getProgresses($ret, $sub);
179  }
180  return $ret;
181  }
182 
183  public function getProgressForNode(int $node_id): ilPRGProgress
184  {
185  $pgs = $this->getProgressTree();
186  $path = $pgs->findSubnodePath((string) $node_id);
187 
188  foreach ($path as $hop) {
189  if ($pgs->getId() !== $hop) {
190  $pgs = $pgs->getSubnode($hop);
191  }
192  }
193  return $pgs;
194  }
195 
196  public function getProgressesWithDeadline(
197  DateTimeImmutable $deadline
198  ): array {
199  return array_values(array_filter(
200  $this->getProgresses(),
201  fn($pgs) => ! is_null($pgs->getDeadline()) && $pgs->getDeadline() <= $deadline
202  ));
203  }
204 
205  public function withEvents(StudyProgrammeEvents $events): self
206  {
207  $clone = clone $this;
208  $clone->events = $events;
209  return $clone;
210  }
211 
212  public function getEvents(): StudyProgrammeEvents
213  {
214  return $this->events;
215  }
216 }
withRestarted(int $restarted_asssignment_id, ?\DateTimeImmutable $restart_date=null)
withLastChange(int $last_change_by, \DateTimeImmutable $last_change)
ilPRGUserInformation $user_info
getProgressesWithDeadline(DateTimeImmutable $deadline)
getProgresses(array &$ret=[], ?ilPRGProgress $pgs=null)
Additional information about a user, used in context of assignments.
withUserInformation(ilPRGUserInformation $user_info)
$path
Definition: ltiservices.php:29
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
A Progress is the status of a user on a single node of an assignment; it is unique by assignment_id:u...
__construct(int $id, int $usr_id)
DateTimeImmutable $last_change
withManuallyAssigned(bool $manual)
withProgressTree(ilPRGProgress $progress)
withEvents(StudyProgrammeEvents $events)
trait ilPRGAssignmentActions
This trait is for (physical) separation of code only; it is actually just part of an ilPRGAssignment ...
DateTimeImmutable $restart_date
getProgressForNode(int $node_id)
Assignments are relations of users to a PRG; They hold progress-information for (sub-)nodes of the PR...
StudyProgrammeEvents $events