ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilStudyProgrammeMailTemplateContext.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
24 {
25  public const ID = 'prg_context_manual';
26 
27  //placeholder(ids)
28  private const TITLE = 'STUDY_PROGRAMME_TITLE';
29  private const DESCRIPTION = 'STUDY_PROGRAMME_DESCRIPTION';
30  private const TYPE = 'STUDY_PROGRAMME_TYPE';
31  private const LINK = 'STUDY_PROGRAMME_LINK';
32  private const ORG_UNIT = 'STUDY_PROGRAMME_ORG_UNITS';
33  private const STATUS = 'STUDY_PROGRAMME_STATUS';
34  private const COMPLETION_DATE = 'STUDY_PROGRAMME_COMPLETION_DATE';
35  private const COMPLETED_BY = 'STUDY_PROGRAMME_COMPLETED_BY';
36  private const POINTS_REQUIRED = 'STUDY_PROGRAMME_POINTS_REQUIRED';
37  private const POINTS_CURRENT = 'STUDY_PROGRAMME_POINTS_CURRENT';
38  private const DEADLINE = 'STUDY_PROGRAMME_DEADLINE';
39  private const EXPIRE_DATE = 'STUDY_PROGRAMME_EXPIRE_DATE';
40  private const VALIDITY = 'STUDY_PROGRAMME_VALIDITY';
41 
42  private const PLACEHOLDER_TRANSLATIONS = [
43  self::TITLE => 'prg_title',
44  self::DESCRIPTION => 'prg_description',
45  self::TYPE => 'prg_type',
46  self::LINK => 'prg_link',
47  self::ORG_UNIT => 'prg_orgus',
48  self::STATUS => 'prg_status',
49  self::COMPLETION_DATE => 'prg_completion_date',
50  self::COMPLETED_BY => 'prg_completion_by',
51  self::POINTS_REQUIRED => 'prg_points_required',
52  self::POINTS_CURRENT => 'prg_points_current',
53  self::DEADLINE => 'prg_deadline',
54  self::EXPIRE_DATE => 'prg_expiry_date',
55  self::VALIDITY => 'prg_validity',
56  ];
57 
58  private const DATE_FORMAT = 'd.m.Y';
59 
60  protected ilLanguage $lng;
61 
62  public function __construct(
63  ?OrgUnitUserService $orgUnitUserService = null,
64  ?ilMailEnvironmentHelper $envHelper = null,
65  ?ilMailUserHelper $usernameHelper = null,
66  ?ilMailLanguageHelper $languageHelper = null
67  ) {
69  $orgUnitUserService,
70  $envHelper,
71  $usernameHelper,
72  $languageHelper
73  );
74 
75  global $DIC;
76 
77  $this->lng = $DIC['lng'];
78  $this->lng->loadLanguageModule('prg');
79  }
80 
81  public function getId(): string
82  {
83  return self::ID;
84  }
85 
86  public function getTitle(): string
87  {
88  return $this->lng->txt('prg_mail_context_title');
89  }
90 
91  public function getDescription(): string
92  {
93  return $this->lng->txt('prg_mail_context_info');
94  }
95 
99  public function getSpecificPlaceholders(): array
100  {
101  $placeholders = [];
102  foreach (self::PLACEHOLDER_TRANSLATIONS as $id => $label) {
103  $placeholders[$id] = [
104  'placeholder' => $id,
105  'label' => $this->lng->txt($label)
106  ];
107  }
108  return $placeholders;
109  }
110 
114  public function resolveSpecificPlaceholder(
115  string $placeholder_id,
116  array $context_parameters,
117  ?ilObjUser $recipient = null
118  ): string {
119 
120  if (is_null($recipient)) {
121  return '';
122  }
123 
124  $placeholder_id = strtoupper($placeholder_id);
125  if (! array_key_exists($placeholder_id, self::PLACEHOLDER_TRANSLATIONS)) {
126  return '';
127  }
128 
130  $prg = ilObjectFactory::getInstanceByRefId((int) $context_parameters['ref_id']);
131  $assignments = $prg->getAssignmentsOfSingleProgramForUser($recipient->getId());
132  $latest = $this->getLatestAssignment($assignments);
133  $latest_successful = $this->getLatestSuccessfulAssignment($assignments);
134 
135  switch ($placeholder_id) {
136  case self::TITLE:
137  $string = $prg->getTitle();
138  break;
139  case self::DESCRIPTION:
140  $string = $prg->getDescription();
141  break;
142  case self::TYPE:
143  $string = '';
144  if (!is_null($prg->getSubType())) {
145  $string = $prg->getSubType()->getTitle();
146  }
147  break;
148  case self::LINK:
149  $string = ilLink::_getLink((int) $context_parameters['ref_id'], 'prg') . ' ';
150  break;
151  case self::ORG_UNIT:
152  $string = ilObjUser::lookupOrgUnitsRepresentation($recipient->getId());
153  break;
154  case self::STATUS:
155  $string = $this->statusToRepr($latest->getProgressTree()->getStatus(), $recipient->getLanguage());
156  break;
157  case self::COMPLETION_DATE:
158  $string = $this->date2String($latest->getProgressTree()->getCompletionDate(), $recipient);
159  break;
160  case self::COMPLETED_BY:
161  $string = '';
162  $id = $latest->getProgressTree()->getCompletionBy();
163  if (!is_null($id) && ilObject::_exists($id)) {
165  if ($obj->getType() === 'usr') {
166  $string = ilObjUser::_lookupLogin($id);
168  if (
169  ilObject::_exists($ref_id, true) &&
171  ) {
173  }
174  }
175  }
176  break;
177  case self::POINTS_REQUIRED:
178  $string = (string) $latest->getProgressTree()->getAmountOfPoints();
179  break;
180  case self::POINTS_CURRENT:
181  $string = (string) $latest->getProgressTree()->getCurrentAmountOfPoints();
182  break;
183  case self::DEADLINE:
184  $string = $latest->getProgressTree()->isInProgress() ?
185  $this->date2String($latest->getProgressTree()->getDeadline(), $recipient) : '';
186 
187  break;
188  case self::VALIDITY:
189  $string = '-';
190  if ($latest_successful) {
191  $langvar = $latest_successful->getProgressTree()->isInvalidated() ? 'prg_not_valid' : 'prg_still_valid';
192  $string = $this->lng->txtlng('prg', $langvar, $recipient->getLanguage());
193  }
194  break;
195 
196  case self::EXPIRE_DATE:
197  $string = '-';
198  if ($latest_successful) {
199  $string = $this->date2String($latest_successful->getProgressTree()->getValidityOfQualification(), $recipient);
200  }
201  break;
202  default:
203  throw new \Exception("cannot resolve placeholder: " . $placeholder_id);
204  $string = '';
205  }
206 
207  return $string;
208  }
209 
210  protected function getLatestAssignment(array $assignments): ilPRGAssignment
211  {
212  usort($assignments, static function (ilPRGAssignment $a, ilPRGAssignment $b): int {
213  $a_dat = $a->getProgressTree()->getAssignmentDate();
214  $b_dat = $b->getProgressTree()->getAssignmentDate();
215  if ($a_dat > $b_dat) {
216  return -1;
217  } elseif ($a_dat < $b_dat) {
218  return 1;
219  } else {
220  return 0;
221  }
222  });
223  return array_shift($assignments);
224  }
225 
226  protected function getLatestSuccessfulAssignment(array $assignments): ?ilPRGAssignment
227  {
228  $successful = array_filter(
229  $assignments,
230  fn($ass) => $ass->getProgressTree()->isSuccessful()
231  );
232  if (count($successful) === 0) {
233  return null;
234  }
235 
236  usort($successful, static function (ilPRGAssignment $a, ilPRGAssignment $b): int {
237  $a_dat = $a->getProgressTree()->getCompletionDate();
238  $b_dat = $b->getProgressTree()->getCompletionDate();
239  if ($a_dat > $b_dat) {
240  return -1;
241  } elseif ($a_dat < $b_dat) {
242  return 1;
243  } else {
244  return 0;
245  }
246  });
247  return array_shift($successful);
248  }
249 
250 
251 
252  protected function statusToRepr(int $status, string $lang): string
253  {
254  if ($status === ilPRGProgress::STATUS_IN_PROGRESS) {
255  return $this->lng->txtlng('prg', 'prg_status_in_progress', $lang);
256  }
257  if ($status === ilPRGProgress::STATUS_COMPLETED) {
258  return $this->lng->txtlng('prg', 'prg_status_completed', $lang);
259  }
260  if ($status === ilPRGProgress::STATUS_ACCREDITED) {
261  return $this->lng->txtlng('prg', 'prg_status_accredited', $lang);
262  }
263  if ($status === ilPRGProgress::STATUS_NOT_RELEVANT) {
264  return $this->lng->txtlng('prg', 'prg_status_not_relevant', $lang);
265  }
266  if ($status === ilPRGProgress::STATUS_FAILED) {
267  return $this->lng->txtlng('prg', 'prg_status_failed', $lang);
268  }
269 
270  throw new ilException("Unknown status: '$status'");
271  }
272 
273  protected function date2String(
274  ?DateTimeImmutable $date_time = null,
275  ?ilObjUser $user = null
276  ): string {
277  if (is_null($date_time)) {
278  return '';
279  }
280  if (is_null($user)) {
281  return $date_time->format(self::DATE_FORMAT);
282  }
283  return $user->getDateFormat()->applyTo($date_time);
284  }
285 }
static _lookupTitle(int $obj_id)
date2String(?DateTimeImmutable $date_time=null, ?ilObjUser $user=null)
static lookupOrgUnitsRepresentation(int $a_usr_id)
lookup org unit representation
__construct(?OrgUnitUserService $orgUnitUserService=null, ?ilMailEnvironmentHelper $envHelper=null, ?ilMailUserHelper $usernameHelper=null, ?ilMailLanguageHelper $languageHelper=null)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static _exists(int $id, bool $reference=false, ?string $type=null)
checks if an object exists in object_data
$ref_id
Definition: ltiauth.php:65
static getInstanceByRefId(int $ref_id, bool $stop_on_error=true)
get an instance of an Ilias object by reference id
global $DIC
Definition: shib_login.php:26
$lang
Definition: xapiexit.php:25
static getInstanceByObjId(?int $obj_id, bool $stop_on_error=true)
get an instance of an Ilias object by object id
resolveSpecificPlaceholder(string $placeholder_id, array $context_parameters, ?ilObjUser $recipient=null)
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
__construct(Container $dic, ilPlugin $plugin)
static _lookupTargetRefId(int $a_obj_id)
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
Assignments are relations of users to a PRG; They hold progress-information for (sub-)nodes of the PR...
static _lookupDeletedDate(int $ref_id)
static _lookupLogin(int $a_user_id)