60 $this->db = $DIC->database();
61 $this->tree = $DIC->repositoryTree();
62 $this->
access = $DIC->access();
64 $this->placeholder_resolver = $DIC->mail()->placeholderResolver();
67 $this->ass_id = $a_ass_id;
70 $this->exc_id = $a_exc_id;
73 $this->rmd_type = $a_type;
75 if ($a_exc_id and $a_ass_id and $a_type) {
91 $this->rmd_status = $a_status;
102 $this->rmd_start = $a_num_days;
112 $this->rmd_end = $a_date;
123 $this->rmd_frequency = $a_num_days;
133 $this->rmd_last_send = $a_timestamp;
143 $this->rmd_tpl_id = $a_tpl_id;
153 $this->db->insert(
"exc_ass_reminders", array(
154 "type" => array(
"text", $this->rmd_type),
155 "ass_id" => array(
"integer", $this->ass_id),
156 "exc_id" => array(
"integer", $this->exc_id),
179 "type" => array(
"text", $this->rmd_type),
180 "exc_id" => array(
"integer", $this->exc_id),
181 "ass_id" => array(
"integer", $this->ass_id)
189 $set = $this->db->queryF(
190 "SELECT status, start, freq, end, last_send, template_id" .
191 " FROM exc_ass_reminders" .
192 " WHERE type = %s AND ass_id = %s AND exc_id = %s",
193 [
"text",
"integer",
"integer"],
194 [$this->rmd_type, $this->ass_id, $this->exc_id]
197 $rec = $this->db->fetchAssoc($set);
198 if (is_array($rec)) {
223 $today = date(
"Y-m-d");
225 $this->log->debug(
"Get reminders $a_type.");
230 if ($a_type == self::SUBMIT_REMINDER || $a_type == self::GRADE_REMINDER || $a_type == self::FEEDBACK_REMINDER) {
231 $and_type =
" AND type = '" . $a_type .
"'";
234 $query =
"SELECT last_send_day, ass_id, exc_id, status, start, freq, end, type, last_send, template_id" .
235 " FROM exc_ass_reminders" .
236 " WHERE status = 1" .
237 " AND start <= " . $now .
238 " AND end > " . ($now - 86400) .
242 $result = $this->db->query($query);
244 $array_data = array();
245 while ($rec = $this->db->fetchAssoc($result)) {
247 "ass_id" => $rec[
"ass_id"],
248 "exc_id" => $rec[
"exc_id"],
249 "start" => $rec[
"start"],
250 "end" => $rec[
"end"],
251 "freq" => $rec[
"freq"],
252 "type" => $rec[
"type"],
253 "last_send" => $rec[
"last_send"],
254 "last_send_day" => $rec[
"last_send_day"],
255 "template_id" => $rec[
"template_id"]
258 $end_day = date(
"Y-m-d", $rec[
"end"]);
262 if ($rec[
"last_send_day"] !=
"") {
263 $date =
new DateTime($rec[
"last_send_day"]);
265 $next_send = $date->format(
'Y-m-d');
267 $this->log->debug(
"ass: " . $rec[
"ass_id"] .
", last send: " . $rec[
"last_send_day"] .
268 ", freq: " . $rec[
"freq"] .
", end_day: $end_day, today: " . $today .
", next send: $next_send");
269 if ($rec[
"last_send_day"] ==
"" || $next_send <= $today) {
270 if ($end_day >= $today) {
271 $this->log->debug(
"included");
272 $array_data[] = $rem;
285 public function parseSubmissionReminders(array $a_reminders): array
287 $reminders = $a_reminders;
288 $users_to_remind = array();
290 foreach ($reminders as $rem) {
291 $ass_id = $rem[
"ass_id"];
294 $exc_id = $rem[
"exc_id"];
297 foreach ($exc_refs as $exc_ref) {
299 if ($course_ref_id = $this->tree->checkForParentType($exc_ref,
'crs')) {
301 $participants_class = ilCourseParticipants::class;
302 $parent_ref_id = $course_ref_id;
303 $parent_obj_type =
'crs';
306 } elseif ($group_ref_id = $this->tree->checkForParentType($exc_ref,
'grp')) {
308 $participants_class = ilGroupParticipants::class;
309 $parent_ref_id = $group_ref_id;
310 $parent_obj_type =
'grp';
316 $parent_obj_id = $obj->getId();
318 $participants_ids = $participants_class::getInstance($parent_ref_id)->getMembers();
320 foreach ($participants_ids as $member_id) {
321 $this->log->debug(
"submission reminder: ass: $ass_id, member: $member_id.");
324 if ($this->
access->checkAccessOfUser($member_id,
"read",
"", $exc_ref)) {
327 $deadline_day = date(
"Y-m-d", $state->getOfficialDeadline());
328 $today = date(
"Y-m-d");
329 $date =
new DateTime($deadline_day);
330 $date->sub(
new DateInterval(
'P' . $rem[
"start"] .
'D'));
331 $send_from = $date->format(
'Y-m-d');
332 $this->log->debug(
"today: $today, send from: $send_from, start: " . $rem[
"start"] .
", submission allowed: " . $state->isSubmissionAllowed());
335 if ($state->isSubmissionAllowed() && $send_from <= $today) {
339 if (!$submission->getLastSubmission()) {
340 $member_data = array(
341 "parent_type" => $parent_obj_type,
342 "parent_id" => $parent_obj_id,
344 "exc_ref" => $exc_ref,
346 "member_id" => $member_id,
347 "reminder_type" => $rem[
"type"],
348 "template_id" => $rem[
"template_id"]
350 $users_to_remind[] = $member_data;
357 return $users_to_remind;
365 $reminders = $a_reminders;
366 $users_to_remind = array();
368 $has_pending_to_grade =
false;
370 foreach ($reminders as $rem) {
373 $members_data = $ass_obj->getMemberListData();
376 foreach ($members_data as $assignment_data) {
379 $has_pending_to_grade =
true;
383 if ($has_pending_to_grade) {
389 $unike_usr_id = array();
390 foreach ($exc_refs as $exc_ref) {
391 if ($this->
access->checkAccessOfUser($user_id,
"write",
"", $exc_ref)) {
392 if (!in_array($user_id, $unike_usr_id)) {
393 $member_data = array(
394 "exc_id" => $rem[
"exc_id"],
395 "exc_ref" => $exc_ref,
396 "ass_id" => $rem[
"ass_id"],
397 "member_id" => $user_id,
398 "reminder_type" => $rem[
"type"],
399 "template_id" => $rem[
"template_id"]
401 $users_to_remind[] = $member_data;
410 return $users_to_remind;
418 $reminders = $a_reminders;
419 $users_to_remind = array();
421 $this->log->debug(
"Peer Reminders: " . count($a_reminders));
423 foreach ($reminders as $reminder) {
424 $this->log->debug(
"Init peer review: " . $reminder[
"ass_id"]);
426 $pr->initPeerReviews();
428 foreach ($giver_ids as $giver_id) {
430 $days_diff = (($state->getPeerReviewDeadline() - time()) / (60 * 60 * 24));
432 if ($state->isPeerReviewAllowed() && $days_diff < $reminder[
"start"]) {
434 foreach ($exc_refs as $exc_ref) {
435 if ($this->
access->checkAccessOfUser($giver_id,
"read",
"", $exc_ref)) {
436 $member_data = array(
437 "exc_id" => $reminder[
"exc_id"],
438 "exc_ref" => $exc_ref,
439 "ass_id" => $reminder[
"ass_id"],
440 "member_id" => $giver_id,
441 "reminder_type" => $reminder[
"type"],
442 "template_id" => $reminder[
"template_id"]
444 $users_to_remind[] = $member_data;
451 return $users_to_remind;
461 $submit_reminders = $this->
getReminders(self::SUBMIT_REMINDER);
462 $parsed_submit_reminders = $this->parseSubmissionReminders($submit_reminders);
464 $grade_reminders = $this->
getReminders(self::GRADE_REMINDER);
467 $peer_reminders = $this->
getReminders(self::FEEDBACK_REMINDER);
485 $reminders = array_merge($parsed_submit_reminders, $parsed_grade_reminders, $parsed_peer_reminders);
496 foreach ($reminders as $reminder) {
497 $template_id = $reminder[
'template_id'];
499 $rmd_type = $reminder[
"reminder_type"];
500 $this->log->debug(
"Sending reminder type = " . $rmd_type);
504 $templateService = $DIC->mail()->textTemplates();
505 $tpl = $templateService->loadTemplateForId((
int) $template_id);
509 $this->log->debug(
"** send reminder WITH template.");
510 $subject = $tpl->getSubject();
512 $placeholder_params = array(
513 "exc_id" => $reminder[
"exc_id"],
514 "exc_ref" => $reminder[
"exc_ref"],
515 "ass_id" => $reminder[
"ass_id"],
516 "member_id" => $reminder[
"member_id"]
520 $this->log->debug(
"** send reminder WITHOUT template.");
527 $ulng->loadLanguageModule(
'exc');
529 $link = ilLink::_getLink($reminder[
"exc_ref"],
"exc", array(),
"_" . $reminder[
"ass_id"]);
533 $this->log->debug(
"send: MAIL TYPE = " . $rmd_type .
", user: " . $reminder[
"member_id"] .
", ass: " . $reminder[
"ass_id"]);
537 $subject = sprintf($ulng->txt(
'exc_reminder_submit_subject'), $ass_title);
538 $message .= $ulng->txt(
'exc_reminder_submit_body') .
":\n\n";
542 $subject = sprintf($ulng->txt(
'exc_reminder_grade_subject'), $ass_title);
543 $message .= $ulng->txt(
'exc_reminder_grade_body') .
":\n\n";
547 $subject = sprintf($ulng->txt(
'exc_reminder_peer_subject'), $ass_title);
548 $message .= $ulng->txt(
'exc_reminder_peer_body') .
":\n\n";
552 $message .= $ulng->txt(
'obj_exc') .
": " . $exc_title .
"\n";
553 $message .= $ulng->txt(
'obj_ass') .
": " . $ass_title .
"\n";
554 $message .=
"\n" . $ulng->txt(
'exc_reminder_link') .
": " . $link;
557 $mail_obj->appendInstallationSignature(
true);
569 return count($reminders);
575 array $a_reminder_data,
576 string $a_reminder_type
580 switch ($a_reminder_type) {
594 $user =
new ilObjUser($a_reminder_data[
"member_id"]);
596 $a_message = $this->placeholder_resolver->resolve(
$context, $a_message, $user, $a_reminder_data);
607 $today = date(
"Y-m-d");
608 foreach ($a_reminders as $reminder) {
609 $sql =
"UPDATE exc_ass_reminders" .
610 " SET last_send = " . $this->db->quote(time(),
'integer') .
611 " , last_send_day = " . $this->db->quote($today,
'date') .
612 " WHERE type = " . $this->db->quote($reminder[
"reminder_type"],
'text') .
613 " AND ass_id = " . $this->db->quote($reminder[
"ass_id"],
'integer') .
614 " AND exc_id = " . $this->db->quote($reminder[
"exc_id"],
'integer');
616 $this->db->manipulate($sql);
623 $sql =
"DELETE FROM exc_ass_reminders" .
624 " WHERE ass_id = " . $a_ass_id;
626 $this->db->manipulate($sql);
sentReminderPlaceholders(string $a_message, array $a_reminder_data, string $a_reminder_type)
updateRemindersLastDate(array $a_reminders)
getReminderMailTemplate()
setReminderMailTemplate(int $a_tpl_id)
static getLogger(string $a_component_id)
Get component logger.
static _lookupFullname(int $a_user_id)
static _getAllReferences(int $id)
get all reference ids for object ID
static lookupTitle(int $a_id)
static lookupGiversWithPendingFeedback(int $a_ass_id)
deleteReminders(int $a_ass_id)
getReminders(string $a_type="")
Get reminders available by date/frequence.
setReminderLastSend(int $a_timestamp)
setReminderFrequency(int $a_num_days)
sendReminders(array $reminders)
static getNotificationsForObject(int $type, int $id, ?int $page_id=null, bool $ignore_threshold=false)
Get all users/recipients for given object.
static getTemplateContextById(string $a_id)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
ilMailTemplatePlaceholderResolver $placeholder_resolver
static _lookupTitle(int $obj_id)
static _getLanguageOfUser(int $a_usr_id)
Get language object of user.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getInstanceByIds(int $a_ass_id, int $a_user_id=0)
setReminderEnd(int $a_date)
Class ilMailTemplatePlaceholderResolver.
parsePeerReminders(array $a_reminders)
const TYPE_EXERCISE_SUBMISSION
Exercise submission //TODO: This class has many static methods related to delivered "files"...
setReminderStart(int $a_num_days)
exit
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setReminderStatus(?bool $a_status)
Set reminder for users without submission.
parseGradeReminders(array $a_reminders)
__construct(int $a_exc_id=0, int $a_ass_id=0, string $a_type="")
static _lookupLogin(int $a_user_id)