diff --git a/admin/tool/lp/classes/api.php b/admin/tool/lp/classes/api.php index e5706ec5c8c..71f607163bd 100644 --- a/admin/tool/lp/classes/api.php +++ b/admin/tool/lp/classes/api.php @@ -3666,14 +3666,30 @@ class api { throw new required_capability_exception($context, 'tool/lp:usercompetencyview', 'nopermissions', ''); } - // TODO - handle archived plans. - $usercompetency = user_competency::get_record(array('userid' => $userid, 'competencyid' => $competencyid)); if (!$usercompetency) { return array(); } - return evidence::get_records(array('usercompetencyid' => $usercompetency->get_id()), $sort, $order, $skip, $limit); + $plancompleted = false; + if ($planid != 0) { + $plan = new plan($planid); + if ($plan->get_status() == plan::STATUS_COMPLETE) { + $plancompleted = true; + } + } + + if ($plancompleted) { + $select = 'usercompetencyid = :usercompetencyid AND timecreated <= :timecompeleted'; + $params = array('usercompetencyid' => $usercompetency->get_id(), 'timecompeleted' => $plan->get_timemodified()); + $orderby = $sort . ' ' . $order; + $evidences = evidence::get_records_select($select, $params, $orderby, '*', $skip, $limit); + } else { + $params = array('usercompetencyid' => $usercompetency->get_id()); + $evidences = evidence::get_records($params, $sort, $order, $skip, $limit); + } + + return $evidences; } /** diff --git a/admin/tool/lp/tests/api_test.php b/admin/tool/lp/tests/api_test.php index 7d9a0da7ef7..eb73096da9f 100644 --- a/admin/tool/lp/tests/api_test.php +++ b/admin/tool/lp/tests/api_test.php @@ -3609,4 +3609,66 @@ class tool_lp_api_testcase extends advanced_testcase { $this->fail('Grading should not be allowed.'); } } + + /** + * Test list of evidences for plan completed and not completed. + */ + public function test_list_evidence() { + global $DB; + + $this->resetAfterTest(true); + $dg = $this->getDataGenerator(); + $lpg = $this->getDataGenerator()->get_plugin_generator('tool_lp'); + + $currenttime = time(); + $syscontext = context_system::instance(); + + // Create users. + $user = $dg->create_user(); + $this->setUser($user); + + // Create a framework and assign competencies. + $framework = $lpg->create_framework(); + $c1 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id())); + $c2 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id())); + + // Create 2 user plans and add competency to each plan. + $p1 = $lpg->create_plan(array('userid' => $user->id)); + $p2 = $lpg->create_plan(array('userid' => $user->id)); + $pc1 = $lpg->create_plan_competency(array('planid' => $p1->get_id(), 'competencyid' => $c1->get_id())); + $pc2 = $lpg->create_plan_competency(array('planid' => $p2->get_id(), 'competencyid' => $c1->get_id())); + + // Create user competency. Add user_evidence and associate it to the user competency. + $uc = $lpg->create_user_competency(array('userid' => $user->id, 'competencyid' => $c1->get_id())); + $ue = $lpg->create_user_evidence(array('userid' => $user->id)); + $uec = $lpg->create_user_evidence_competency(array('userevidenceid' => $ue->get_id(), 'competencyid' => $c1->get_id())); + $e1 = $lpg->create_evidence(array('usercompetencyid' => $uc->get_id())); + + // Check both plans as one evidence. + $this->assertEquals(1, count(api::list_evidence($user->id, $c1->get_id(), $p1->get_id()))); + $this->assertEquals(1, count(api::list_evidence($user->id, $c1->get_id(), $p2->get_id()))); + + // Complete second plan. + $currenttime += 1; + $p2->set_status(plan::STATUS_COMPLETE); + $p2->update(); + $plansql = "UPDATE {tool_lp_plan} SET timemodified = :currenttime WHERE id = :planid"; + $DB->execute($plansql, array('currenttime' => $currenttime, 'planid' => $p2->get_id())); + + // Add an other user evidence for the same competency. + $currenttime += 1; + $ue2 = $lpg->create_user_evidence(array('userid' => $user->id)); + $uec2 = $lpg->create_user_evidence_competency(array('userevidenceid' => $ue2->get_id(), 'competencyid' => $c1->get_id())); + $e2 = $lpg->create_evidence(array('usercompetencyid' => $uc->get_id())); + $evidencesql = "UPDATE {tool_lp_evidence} SET timecreated = :currenttime WHERE id = :evidenceid"; + $DB->execute($evidencesql, array('currenttime' => $currenttime, 'evidenceid' => $e2->get_id())); + + // Check first plan which is not completed as all evidences. + $this->assertEquals(2, count(api::list_evidence($user->id, $c1->get_id(), $p1->get_id()))); + + // Check second plan completed before the new evidence as only the first evidence. + $listevidences = api::list_evidence($user->id, $c1->get_id(), $p2->get_id()); + $this->assertEquals(1, count($listevidences)); + $this->assertEquals($e1->get_id(), $listevidences[$e1->get_id()]->get_id()); + } } diff --git a/admin/tool/lp/tests/generator/lib.php b/admin/tool/lp/tests/generator/lib.php index ada93195c30..cc6ad87c845 100644 --- a/admin/tool/lp/tests/generator/lib.php +++ b/admin/tool/lp/tests/generator/lib.php @@ -36,6 +36,8 @@ use tool_lp\user_competency; use tool_lp\user_competency_plan; use tool_lp\plan_competency; use tool_lp\evidence; +use tool_lp\user_evidence; +use tool_lp\user_evidence_competency; defined('MOODLE_INTERNAL') || die(); @@ -61,6 +63,9 @@ class tool_lp_generator extends component_generator_base { /** @var int Number of created templates. */ protected $templatecount = 0; + /** @var int Number of created user_evidence. */ + protected $userevidencecount = 0; + /** @var stdClass Scale that we might need. */ protected $scale; @@ -433,5 +438,57 @@ class tool_lp_generator extends component_generator_base { return $cc; } + /** + * Create a new user_evidence. + * + * @param array|stdClass $record + * @return evidence + */ + public function create_user_evidence($record = null) { + $this->userevidencecount++; + $i = $this->userevidencecount; + $record = (object) $record; + + if (!isset($record->userid)) { + throw new coding_exception('The userid value is required.'); + } + if (!isset($record->name)) { + $record->name = "Evidence $i name"; + } + if (!isset($record->description)) { + $record->description = "Evidence $i description"; + } + if (!isset($record->descriptionformat)) { + $record->descriptionformat = FORMAT_HTML; + } + + $ue = new user_evidence(0, $record); + $ue->create(); + + return $ue; + } + + /** + * Create a new user_evidence_comp. + * + * @param array|stdClass $record + * @return evidence + */ + public function create_user_evidence_competency($record = null) { + $record = (object) $record; + + if (!isset($record->userevidenceid)) { + throw new coding_exception('The userevidenceid value is required.'); + } + if (!isset($record->competencyid)) { + throw new coding_exception('The competencyid value is required.'); + } + + $uec = new user_evidence_competency(0, $record); + $uec->create(); + + return $uec; + } + }