$this->assertFalse($badge->is_issued($this->user->id));
// Mark course as complete.
- $sink = $this->redirectEmails();
+ $sink = $this->redirectMessages();
$ccompletion->mark_complete();
- $this->assertCount(1, $sink->get_messages());
+ // Two messages are generated: One for the course completed and the other one for the badge awarded.
+ $messages = $sink->get_messages();
+ $this->assertCount(2, $messages);
+ $this->assertEquals('badgerecipientnotice', $messages[0]->eventtype);
+ $this->assertEquals('coursecompleted', $messages[1]->eventtype);
$sink->close();
// Check if badge is awarded.
\core\event\course_completed::create_from_completion($data)->trigger();
}
+ // Notify user.
+ $course = get_course($data->course);
+ $messagesubject = get_string('coursecompleted', 'completion');
+ $a = [
+ 'coursename' => get_course_display_name_for_list($course),
+ 'courselink' => (string) new moodle_url('/course/view.php', array('id' => $course->id)),
+ ];
+ $messagebody = get_string('coursecompletedmessage', 'completion', $a);
+ $messageplaintext = html_to_text($messagebody);
+
+ $eventdata = new \core\message\message();
+ $eventdata->courseid = $course->id;
+ $eventdata->component = 'moodle';
+ $eventdata->name = 'coursecompleted';
+ $eventdata->userfrom = core_user::get_noreply_user();
+ $eventdata->userto = $data->userid;
+ $eventdata->notification = 1;
+ $eventdata->subject = $messagesubject;
+ $eventdata->fullmessage = $messageplaintext;
+ $eventdata->fullmessageformat = FORMAT_HTML;
+ $eventdata->fullmessagehtml = $messagebody;
+ $eventdata->smallmessage = $messageplaintext;
+
+ if ($courseimage = \core_course\external\course_summary_exporter::get_course_image($course)) {
+ $eventdata->customdata = [
+ 'notificationpictureurl' => $courseimage,
+ ];
+ }
+ message_send($eventdata);
+
return $result;
}
$string['coursealreadycompleted'] = 'You have already completed this course';
$string['coursecomplete'] = 'Course complete';
$string['coursecompleted'] = 'Course completed';
+$string['coursecompletedmessage'] = '<p>Congratulations!</p><p>You just completed the following course: <a href="{$a->courselink}">{$a->coursename}</a>.</p>';
$string['coursecompletion'] = 'Course completion';
$string['coursecompletioncondition'] = 'Condition: {$a}';
$string['coursegrade'] = 'Course grade';
$string['messageprovider:badgerecipientnotice'] = 'Badge recipient notifications';
$string['messageprovider:competencyplancomment'] = 'Comment posted on a learning plan';
$string['messageprovider:competencyusercompcomment'] = 'Comment posted on a competency';
+$string['messageprovider:coursecompleted'] = 'Course completed';
$string['messageprovider:courserequestapproved'] = 'Course creation request approval notification';
$string['messageprovider:courserequested'] = 'Course creation request notification';
$string['messageprovider:courserequestrejected'] = 'Course creation request rejection notification';
),
),
+ // Course completed. Requires course completion configured at course level. It does not work with just activity progress.
+ 'coursecompleted' => [],
+
// Badge award notification to a badge recipient.
'badgerecipientnotice' => array (
'defaults' => array(
$this->assertEventLegacyData($data, $event);
}
+ /**
+ * Test course completed message.
+ */
+ public function test_course_completed_message() {
+ $this->setup_data();
+ $this->setAdminUser();
+
+ $completionauto = array('completion' => COMPLETION_TRACKING_AUTOMATIC);
+ $ccompletion = new completion_completion(array('course' => $this->course->id, 'userid' => $this->user->id));
+
+ // Mark course as complete and get the message.
+ $sink = $this->redirectMessages();
+ $ccompletion->mark_complete();
+ $messages = $sink->get_messages();
+ $sink->close();
+
+ $this->assertCount(1, $messages);
+ $message = array_pop($messages);
+
+ $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
+ $this->assertEquals($this->user->id, $message->useridto);
+ $this->assertEquals('coursecompleted', $message->eventtype);
+ $this->assertEquals(get_string('coursecompleted', 'completion'), $message->subject);
+ $this->assertContains($this->course->fullname, $message->fullmessage);
+ }
+
/**
* Test course completed event.
*/