package org.webcat.outcomesmeasurement.reports; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.webcat.core.Semester; import org.webcat.outcomesmeasurement.Coursework; import org.webcat.outcomesmeasurement.OutcomePair; import org.webcat.outcomesmeasurement.OutcomePairStatistic; import org.webcat.outcomesmeasurement.StudentAnswer; import com.webobjects.eocontrol.EOEditingContext; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSMutableArray; public class OutcomeReports { /** * Generates the default report. * The default report pulls all outcome pairs found in the system and then pulls all grades for that * outcome pair. It takes the results and categorizes the scores into three categories - poor, * moderate and excellent. * @param context The EOEdtingContext of the web app. * @param excellentCutoff The lowest percentage score that still qualifies as excellent. Also acts as the upper bound for the moderate scores. * @param moderateCutoff The lowest percentage score that still qualifies as moderate. Also acts as the upper bound for the poor scores. * @return Returns an array of OutcomePairStatistics for display on the reports page. */ public static NSMutableArray<OutcomePairStatistic> generateDefaultReport(EOEditingContext context, BigDecimal excellentCutoff, BigDecimal moderateCutoff){ NSMutableArray<OutcomePairStatistic> returnList = new NSMutableArray<OutcomePairStatistic>(); NSArray<OutcomePair> allOutcomePairs = OutcomePair.allObjects(context); for (OutcomePair pair : allOutcomePairs){ OutcomePairStatistic opStat = new OutcomePairStatistic(); opStat.setOutcomePair(pair); NSArray<Coursework> courseworks = pair.courseworks(); for (Coursework cw : courseworks){ NSArray<StudentAnswer> answers = cw.studentAnswers(); for (StudentAnswer answer: answers){ BigDecimal percent = new BigDecimal(answer.percentEarned()); if (percent != null){ percent = percent.multiply(new BigDecimal(100)); if (percent.compareTo(excellentCutoff) >= 0){ opStat.incrementExcellent(); } else if (percent.compareTo(moderateCutoff) >= 0){ opStat.incrementAdequate(); } else { opStat.incrementUnsatisfactory(); } } } } if (opStat.getTotalNumber() > 0) returnList.add(opStat); } return returnList; } public static NSMutableArray<OutcomePairStatistic> generateOutcomeOverTimeReport(EOEditingContext context, BigDecimal excellentCutoff, BigDecimal moderateCutoff, OutcomePair outcomePair){ NSMutableArray<OutcomePairStatistic> returnList = new NSMutableArray<OutcomePairStatistic>(); Map<String, OutcomePairStatistic> semesterOutcomesMap = new HashMap<String, OutcomePairStatistic>(); NSArray<Coursework> courseworks = outcomePair.courseworks(); for (Coursework cw : courseworks){ NSArray<StudentAnswer> answers = cw.studentAnswers(); Semester sem = cw.courseOffering().semester(); if (sem == null) continue; if (semesterOutcomesMap.containsKey(sem.toString())){ System.out.println("Semester A"); }else { OutcomePairStatistic opStat = new OutcomePairStatistic(); opStat.setOutcomePair(outcomePair); opStat.setSemester(sem); semesterOutcomesMap.put(sem.toString(), opStat); System.out.println("Semester B"); } for (StudentAnswer answer : answers){ BigDecimal percent = new BigDecimal(answer.percentEarned()); if (percent != null){ percent = percent.multiply(new BigDecimal(100)); if (percent.compareTo(excellentCutoff) >= 0){ semesterOutcomesMap.get(sem.toString()).incrementExcellent(); } else if (percent.compareTo(moderateCutoff) >= 0){ semesterOutcomesMap.get(sem.toString()).incrementAdequate(); } else { semesterOutcomesMap.get(sem.toString()).incrementUnsatisfactory(); } } } } Set<String> allSems = semesterOutcomesMap.keySet(); System.out.println("Map Size: " + allSems.size()); for (String entry : allSems){ if (semesterOutcomesMap.get(entry).getTotalNumber() > 0) returnList.add(semesterOutcomesMap.get(entry)); } return returnList; } }