// set parent
$category->parentcategory = $grade_category->parent;
$grade_item = $grade_category->load_grade_item();
- foreach ($grade_item as $key => $value) {
+ // nomalize coef values if needed
+ if ($parent_category = $grade_category->get_parent_category()) {
+ if ($parent_category->aggregation == GRADE_AGGREGATE_SUM or $parent_category->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2) {
+ $grade_item->aggregationcoef = $grade_item->aggregationcoef == 0 ? 0 : 1;
+ }
+ }
+ foreach ($grade_item->get_record_data() as $key => $value) {
$category->{"grade_item_$key"} = $value;
}
if (empty($parent_category)) {
$item->aggregationcoef = 0;
-} else if ($parent_category->aggregation == GRADE_AGGREGATE_SUM) {
- $item->aggregationcoef = $item->aggregationcoef > 0 ? 1 : 0;
+} else if ($parent_category->aggregation == GRADE_AGGREGATE_SUM or $parent_category->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2) {
+ $item->aggregationcoef = $item->aggregationcoef == 0 ? 0 : 1;
} else {
$item->aggregationcoef = format_float($item->aggregationcoef, 4);
}
}
$script = "window.location='index.php?id={$params['id']}&category={$category->id}&aggregationtype='+this.value+'&sesskey=" . sesskey()."';";
- $aggregation = choose_from_menu($options, 'aggregation_'.$category->id, $category->aggregation, get_string('choose'), $script, 0, true);
+ $aggregation = choose_from_menu($options, 'aggregation_'.$category->id, $category->aggregation, null, $script, 0, true);
if ($this->forced) {
$aggregation = $options[$category->aggregation];
if ($cat->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN) {
$coefstring = ($coefstring=='' or $coefstring=='aggregationcoefweight') ? 'aggregationcoefweight' : 'aggregationcoef';
+ } else if ($cat->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2) {
+ $coefstring = ($coefstring=='' or $coefstring=='aggregationcoefextrasum') ? 'aggregationcoefextrasum' : 'aggregationcoef';
+
} else if ($cat->aggregation == GRADE_AGGREGATE_EXTRACREDIT_MEAN) {
$coefstring = ($coefstring=='' or $coefstring=='aggregationcoefextra') ? 'aggregationcoefextra' : 'aggregationcoef';
if ($parent_category->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN) {
$aggcoef = 'aggregationcoefweight';
+ } else if ($parent_category->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2) {
+ $aggcoef = 'aggregationcoefextrasum';
+
} else if ($parent_category->aggregation == GRADE_AGGREGATE_EXTRACREDIT_MEAN) {
$aggcoef = 'aggregationcoefextra';
}
break;
- case GRADE_AGGREGATE_WEIGHTED_MEAN2: // Weighted average of all existing final grades, weight is the range of grade (ususally grademax)
+ case GRADE_AGGREGATE_WEIGHTED_MEAN2:
+ // Weighted average of all existing final grades with optional extra credit flag,
+ // weight is the range of grade (ususally grademax)
$weightsum = 0;
- $sum = 0;
+ $sum = null;
foreach($grade_values as $itemid=>$grade_value) {
$weight = $items[$itemid]->grademax - $items[$itemid]->grademin;
if ($weight <= 0) {
continue;
}
- $weightsum += $weight;
- $sum += $weight * $grade_value;
+ if ($items[$itemid]->aggregationcoef == 0) {
+ $weightsum += $weight;
+ }
+ $sum += $weight * $grade_value;
}
if ($weightsum == 0) {
- $agg_grade = null;
+ $agg_grade = $sum; // only extra credits
} else {
$agg_grade = $sum / $weightsum;
}
case GRADE_AGGREGATE_EXTRACREDIT_MEAN: // special average
$num = 0;
- $sum = 0;
+ $sum = null;
foreach($grade_values as $itemid=>$grade_value) {
if ($items[$itemid]->aggregationcoef == 0) {
$num += 1;
*/
public function is_aggregationcoef_used() {
return ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN
+ or $this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2
or $this->aggregation == GRADE_AGGREGATE_EXTRACREDIT_MEAN
or $this->aggregation == GRADE_AGGREGATE_SUM);
// No parent category is overriding this category's aggregation, return its string
if ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN) {
$this->coefstring = 'aggregationcoefweight';
+ } else if ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2) {
+ $this->coefstring = 'aggregationcoefextrasum';
} else if ($this->aggregation == GRADE_AGGREGATE_EXTRACREDIT_MEAN) {
$this->coefstring = 'aggregationcoefextra';
} else if ($this->aggregation == GRADE_AGGREGATE_SUM) {