예제 #1
0
 /**
  * Test complete function.
  */
 public function test_complete()
 {
     $dataset = $this->createCsvDataSet(array(user::TABLE => elispm::file('tests/fixtures/pmuser.csv'), curriculum::TABLE => elispm::file('tests/fixtures/curriculum.csv'), curriculumstudent::TABLE => elispm::file('tests/fixtures/curriculum_student.csv')));
     $this->loadDataSet($dataset);
     $cs = new curriculumstudent(2);
     $cs->load();
     $cs->complete(time(), 5);
     // Verify.
     $completed = curriculumstudent::get_completed_for_user(103);
     $count = 0;
     foreach ($completed as $cstu) {
         $this->assertTrue($cstu instanceof curriculumstudent);
         $this->assertEquals(103, $cstu->userid);
         $count++;
     }
     $this->assertEquals(1, $count);
 }
예제 #2
0
 *
 */
/**
 * Generates a PDF certificate corresponding to a particular curriculum assignment.
 */
require_once dirname(__FILE__) . '/../../config.php';
require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php';
require_once elispm::lib('data/curriculumstudent.class.php');
require_once elispm::lib('certificate.php');
require_once elispm::lib('deprecatedlib.php');
// cm_get_crlmuserid()
// Retrieve curriculum assignment.
$id = required_param('id', PARAM_INT);
$curass = new curriculumstudent($id);
// TBD: following required to get user name to display on certificate!
$curass->load();
if (!empty($curass->user)) {
    $curass->user->load();
}
$curuserid = cm_get_crlmuserid($USER->id);
if (!isset($curass->user) || !isset($curass->curriculum)) {
    print_string('invalid_curriculum_completion', 'local_elisprogram');
} else {
    if ($curuserid != $curass->userid) {
        print_string('curriculum_userid_mismatch', 'local_elisprogram');
    } else {
        if (0 == (int) $curass->timecompleted) {
            print_string('error_curriculum_incomplete', 'local_elisprogram');
        } else {
            $datecomplete = date("F j, Y", $curass->timecompleted);
            $dateexpired = '';
예제 #3
0
 /**
  * Check for any curriculum completed nags that need to be handled.
  * @return boolean True if successful, otherwise false.
  */
 public static function check_for_completed_nags()
 {
     global $CFG, $DB;
     // Completed curricula:
     $select = 'SELECT cce.id as id, cce.credits AS curcredits, cce.completetime AS clscomplete,
                 cur.id as curid, cur.reqcredits as reqcredits,
                 cca.id as curassid, cca.userid, cca.curriculumid, cca.completed, cca.timecompleted,
                 cca.credits, cca.locked, cca.timecreated, cca.timemodified, cca.timeexpired,
                 ccc.courseid as courseid, ccc.required AS crsrequired ';
     // >* This will return ALL class enrolment records for a user's curriculum assignment.
     $from = 'FROM {' . curriculumstudent::TABLE . '} cca ';
     $join = 'INNER JOIN {' . user::TABLE . '} cu ON cu.id = cca.userid
                 INNER JOIN {' . curriculum::TABLE . '} cur ON cca.curriculumid = cur.id
                 INNER JOIN {' . curriculumcourse::TABLE . '} ccc ON ccc.curriculumid = cur.id
                 INNER JOIN {' . course::TABLE . '} cco ON cco.id = ccc.courseid
                 INNER JOIN {' . pmclass::TABLE . '} ccl ON ccl.courseid = cco.id
                 INNER JOIN {' . student::TABLE . '} cce ON (cce.classid = ccl.id) AND (cce.userid = cca.userid) ';
     // >*
     $where = 'WHERE (cca.completed = 0) AND (cce.completestatusid != ' . STUSTATUS_NOTCOMPLETE . ') ';
     $order = 'ORDER BY cur.id, cca.id ASC ';
     $sql = $select . $from . $join . $where . $order;
     $curassid = 0;
     $curid = 0;
     $numcredits = 0;
     $reqcredits = 10000;
     // Initially so a completion event is not triggered.
     $requiredcourseids = array();
     $checkcourses = $requiredcourseids;
     $context = false;
     $timenow = 0;
     $timerun = time();
     $secondsinaday = 60 * 60 * 24;
     $rs = $DB->get_recordset_sql($sql);
     if ($rs) {
         foreach ($rs as $rec) {
             // Loop through enrolment records grouped by curriculum and curriculum assignments,
             // counting the credits achieved and looking for all required courses to be complete.
             // Load a new curriculum assignment.
             if ($curassid != $rec->curassid) {
                 // Check for completion - all credits have been earned and all required courses completed.
                 if ($curassid && $numcredits >= $reqcredits && empty($checkcourses)) {
                     $currstudent->complete($timenow ? $timenow : $timerun, $numcredits, 1);
                     $timenow = 0;
                 }
                 $curassid = $rec->curassid;
                 $currstudent = new curriculumstudent($rec->curassid);
                 $currstudent->load();
                 $numcredits = 0;
                 $checkcourses = $requiredcourseids;
             }
             if (!empty($rec->crsrequired) && $rec->clscomplete > $timenow) {
                 $timenow = $rec->clscomplete;
             }
             // Get a new list of required courses.
             if ($curid != $rec->curid) {
                 $curid = $rec->curid;
                 $reqcredits = $rec->reqcredits;
                 $select = 'curriculumid = ' . $curid . ' AND required = 1';
                 if (!($requiredcourseids = $DB->get_records_select(curriculumcourse::TABLE, $select, null, '', 'courseid,required'))) {
                     $requiredcourseids = array();
                 }
                 $checkcourses = $requiredcourseids;
             }
             // Track data for completion...
             $numcredits += $rec->curcredits;
             if (isset($checkcourses[$rec->courseid])) {
                 unset($checkcourses[$rec->courseid]);
             }
         }
     }
     // Check for last record completion - all credits have been earned and all required courses completed.
     if ($curassid && $numcredits >= $reqcredits && empty($checkcourses)) {
         $currstudent->complete($timenow ? $timenow : $timerun, $numcredits, 1);
     }
     $sendtouser = elis::$config->local_elisprogram->notify_curriculumnotcompleted_user;
     $sendtorole = elis::$config->local_elisprogram->notify_curriculumnotcompleted_role;
     $sendtosupervisor = elis::$config->local_elisprogram->notify_curriculumnotcompleted_supervisor;
     // If nobody receives a notification, we're done.
     if (!$sendtouser && !$sendtorole && !$sendtosupervisor) {
         return true;
     }
     // Incomplete curricula:
     $select = 'SELECT cca.id as id, cca.userid, cca.curriculumid, cca.completed, cca.timecompleted, cca.credits,
                 cca.locked, cca.timecreated, cca.certificatecode, cca.timemodified, cur.id as curid,
                 cur.timetocomplete as timetocomplete ';
     $from = 'FROM {' . curriculumstudent::TABLE . '} cca ';
     $join = 'INNER JOIN {' . user::TABLE . '} cu ON cu.id = cca.userid
                 INNER JOIN {' . curriculum::TABLE . '} cur ON cca.curriculumid = cur.id
                 LEFT JOIN {' . notificationlog::TABLE . '} cnl ON cnl.fromuserid = cu.id AND cnl.instance = cca.id AND
                 cnl.event = \'curriculum_notcompleted\' ';
     $where = 'WHERE (cca.completed = 0) AND (cur.timetocomplete != \'\') AND (cur.timetocomplete NOT LIKE \'0h, 0d, 0w, 0m, 0y%\') AND cnl.id IS NULL ';
     $order = 'ORDER BY cur.id, cca.id ASC ';
     $sql = $select . $from . $join . $where . $order;
     $context = false;
     $timenow = time();
     $secondsinaday = 60 * 60 * 24;
     $rs = $DB->get_recordset_sql($sql);
     if ($rs) {
         foreach ($rs as $rec) {
             // Loop through curriculum assignments checking for nags.
             $deltad = new datedelta($rec->timetocomplete);
             // Need to fit this into the SQL instead.
             $reqcompletetime = $rec->timecreated + $deltad->gettimestamp();
             // If no time to completion set, it has no completion restriction.
             if ($reqcompletetime == 0) {
                 continue;
             }
             $daysfrom = ($reqcompletetime - $timenow) / $secondsinaday;
             if ($daysfrom <= elis::$config->local_elisprogram->notify_curriculumnotcompleted_days) {
                 events_trigger('curriculum_notcompleted', $rec);
             }
         }
     }
     return true;
 }