diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 8f0f549fe9a46..45c90d90b9ce2 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -243,24 +243,27 @@ public function process_data($data) { // Detect changes in exemption checkbox. if ($oldvalue->can_apply_penalty_to_overridden_mark()) { - $exemptionchanged = isset($data->exemption[$userid][$itemid]) != - !$oldvalue->is_penalty_applied_to_overridden_mark(); + if (!isset($data->exemption[$userid][$itemid])) { + $newvalue = format_float($postedvalue - $oldvalue->deductedmark, + $oldvalue->grade_item->get_decimals()); + } else { + $newvalue = $postedvalue; + } } else { - $exemptionchanged = false; + $newvalue = $postedvalue; } // If the grade item uses a custom scale if (!empty($oldvalue->grade_item->scaleid)) { - if ((int)$oldvalue->finalgrade === (int)$postedvalue && !$exemptionchanged) { + if ((int)$oldvalue->finalgrade === (int)$newvalue) { continue; } } else { // The grade item uses a numeric scale // Format the finalgrade from the DB so that it matches the grade from the client - if ($postedvalue === format_float($oldvalue->finalgrade, $oldvalue->grade_item->get_decimals()) - && !$exemptionchanged) { + if ($newvalue === format_float($oldvalue->finalgrade, $oldvalue->grade_item->get_decimals())) { continue; } } @@ -335,15 +338,17 @@ public function process_data($data) { } } + // Save final grade, without penalty. $gradeitem->update_final_grade($userid, $finalgrade, 'gradebook', false, FORMAT_MOODLE, null, null, true); - // Save overridden mark. + // Save overridden mark, without penalty. $gradeitem->update_overridden_mark($userid, $finalgrade); // Apply penalty. if ($oldvalue->can_apply_penalty_to_overridden_mark() && !isset($data->exemption[$userid][$itemid])) { - $gradeitem->update_final_grade($userid, $finalgrade - $oldvalue->deductedmark, 'gradepenalty', false, + // Apply penalty. + $gradeitem->update_final_grade($userid, $newvalue, 'gradepenalty', false, FORMAT_MOODLE, null, null, true); } } @@ -1168,12 +1173,19 @@ public function get_right_rows(bool $displayaverages): array { // Show option for user to apply penalty or not. if ($grade->can_apply_penalty_to_overridden_mark()) { $context->canapplypenalty = true; + if ($grade->is_penalty_applied_to_final_grade()) { + // We are editing the original grade value, ie, before applying penalty. + $context->value = format_float($gradeval + $grade->deductedmark, $decimalpoints); + } else { + $context->value = $value; + } + // Current grade. + $context->effectivegrade = $value; $context->deductedmark = format_float($grade->deductedmark, $decimalpoints); - $context->penaltyexempted = !$grade->is_penalty_applied_to_overridden_mark(); + $context->penaltyexempted = !$grade->is_penalty_applied_to_final_grade(); $context->exemptionid = 'exemption' . $userid . '_' . $item->id; $context->exemptionname = 'exemption[' . $userid . '][' . $item->id .']'; - $context->exemptionlabel = get_string('applypenaltytext', 'gradereport_grader'); - $context->exemptionarialabel = $gradelabel . ' ' . + $context->exemptionlabel = $gradelabel . ' ' . get_string('applypenaltytext', 'gradereport_grader'); $context->exemptiontooltip = get_string('applypenaltytooltip', 'gradereport_grader'); } diff --git a/grade/report/grader/templates/cell.mustache b/grade/report/grader/templates/cell.mustache index 293a709a4be7b..7dee1873929f0 100644 --- a/grade/report/grader/templates/cell.mustache +++ b/grade/report/grader/templates/cell.mustache @@ -41,22 +41,12 @@ {{>core_grades/grades/grader/scale}} {{/scale}} {{^scale}} -