diff --git a/php-classes/Slate/CBL/StudentCompetency.php b/php-classes/Slate/CBL/StudentCompetency.php index 55cfae680..74cb14cd2 100644 --- a/php-classes/Slate/CBL/StudentCompetency.php +++ b/php-classes/Slate/CBL/StudentCompetency.php @@ -9,6 +9,7 @@ use Slate\CBL\Demonstrations\Demonstration; use Slate\CBL\Demonstrations\DemonstrationSkill; +use Slate\CBL\Demonstrations\OverrideDemonstration; class StudentCompetency extends \ActiveRecord { @@ -227,9 +228,10 @@ public function getDemonstrationData() 'SkillID', ' SELECT DemonstrationSkill.*, - Demonstration.Demonstrated AS DemonstrationDate + Demonstration.Demonstrated AS DemonstrationDate, + Demonstration.Class AS DemonstrationClass FROM `%s` DemonstrationSkill - JOIN (SELECT ID, Demonstrated FROM `%s` WHERE StudentID = %u) Demonstration + JOIN (SELECT ID, Demonstrated, Class FROM `%s` WHERE StudentID = %u) Demonstration ON Demonstration.ID = DemonstrationSkill.DemonstrationID WHERE (%s) ORDER BY SkillID, DemonstrationDate, DemonstrationID @@ -252,7 +254,8 @@ public function getDemonstrationData() $demonstrationSkill['DemonstrationDate'] = strtotime($demonstrationSkill['DemonstrationDate']); $demonstrationSkill['TargetLevel'] = intval($demonstrationSkill['TargetLevel']); $demonstrationSkill['DemonstratedLevel'] = intval($demonstrationSkill['DemonstratedLevel']); - $demonstrationSkill['Override'] = $demonstrationSkill['Override'] == '1'; + $demonstrationSkill['DemonstrationClass'] = $demonstrationSkill['DemonstrationClass']; + $demonstrationSkill['EvidenceWeight'] = !empty($demonstrationSkill['EvidenceWeight']) ? intval($demonstrationSkill['EvidenceWeight']) : null; } } } else { @@ -271,16 +274,29 @@ public function getDemonstrationOpportunities() { if ($this->demonstrationOpportunities === null) { $this->demonstrationOpportunities = 0; - + $hasWildCard = false; foreach ($this->getDemonstrationData() as $skillId => $demonstrationData) { foreach ($demonstrationData as $demonstration) { - if (empty($demonstration['Override'])) { - $this->demonstrationOpportunities++; + // skip overrides by class + if ($demonstration['DemonstrationClass'] == OverrideDemonstration::class) { + continue; + } + + if ($demonstration['EvidenceWeight'] === null) { + $hasWildcard = true; + break; + } else { + $this->demonstrationOpportunities += $demonstration['EvidenceWeight']; } } } } + if ($hasWildCard) { + // return total requirements + $this->demonstrationOpportunities = $this->getDemonstrationsRequired(); + } + return $this->demonstrationOpportunities; } @@ -329,8 +345,11 @@ public function getDemonstrationsLogged() foreach ($this->getEffectiveDemonstrationsData() as $skillId => $demonstrationData) { foreach ($demonstrationData as $demonstration) { - if (empty($demonstration['Override']) && !empty($demonstration['DemonstratedLevel'])) { - $this->demonstrationsLogged++; + if ( // ignore override + $demonstration['DemonstrationClass'] !== OverrideDemonstration::class && + !empty($demonstration['DemonstratedLevel']) + ) { + $this->demonstrationsLogged += $demonstration['EvidenceWeight']; } } } @@ -347,7 +366,10 @@ public function getDemonstrationsMissed() foreach ($this->getEffectiveDemonstrationsData() as $skillId => $demonstrationData) { foreach ($demonstrationData as $demonstration) { - if (empty($demonstration['Override']) && empty($demonstration['DemonstratedLevel'])) { + if ( + $demonstration['DemonstrationClass'] !== OverrideDemonstration::class && + empty($demonstration['DemonstratedLevel']) + ) { $this->demonstrationsMissed++; } } @@ -369,10 +391,10 @@ public function getDemonstrationsComplete() $skillCount = 0; foreach ($demonstrationData as $demonstration) { - if (!empty($demonstration['Override'])) { + if ($demonstration['DemonstrationClass'] === OverrideDemonstration::class) { $skillCount += $demonstrationsRequired; } elseif (!empty($demonstration['DemonstratedLevel'])) { - $skillCount++; + $skillCount+= $demonstration['EvidenceWeight']; } } @@ -392,7 +414,7 @@ public function getDemonstrationsAverage() $totalScore = 0; foreach ($effectiveDemonstrationsData as $skillId => $demonstrationsData) { foreach ($demonstrationsData as $demonstration) { - if (empty($demonstration['Override'])) { + if ($demonstration['DemonstrationClass'] !== OverrideDemonstration::class) { $totalScore += $demonstration['DemonstratedLevel']; } }