001package org.kuali.student.enrollment.class2.courseoffering.krms.termresolver; 002 003import org.kuali.rice.krms.api.engine.TermResolutionException; 004import org.kuali.rice.krms.api.engine.TermResolver; 005import org.kuali.student.enrollment.academicrecord.dto.StudentCourseRecordInfo; 006import org.kuali.student.enrollment.academicrecord.service.AcademicRecordService; 007import org.kuali.student.r2.common.dto.ContextInfo; 008import org.kuali.student.r2.common.krms.util.KSKRMSExecutionUtil; 009import org.kuali.student.r2.core.atp.dto.AtpInfo; 010import org.kuali.student.r2.core.atp.service.AtpService; 011import org.kuali.student.r2.core.constants.KSKRMSServiceConstants; 012 013import java.util.Collections; 014import java.util.HashSet; 015import java.util.List; 016import java.util.Map; 017import java.util.Set; 018 019/** 020 * Return true if student has successfully completed the course between the 021 * given two terms. 022 * 023 * Rule statement example: 024 * 1) Must have successfully completed <course> between <term1> and <term2> 025 * 026 * @author Kuali Student Team 027 */ 028public class CompletedCourseBetweenTermsTermResolver implements TermResolver<Boolean> { 029 030 private AcademicRecordService academicRecordService; 031 private AtpService atpService; 032 033 private TermResolver<List<String>> cluIdsTermResolver; 034 private TermResolver<AtpInfo> atpForCOIdTermResolver; 035 036 @Override 037 public Set<String> getPrerequisites() { 038 Set<String> prereqs = new HashSet<String>(2); 039 prereqs.add(KSKRMSServiceConstants.TERM_PREREQUISITE_PERSON_ID); 040 prereqs.add(KSKRMSServiceConstants.TERM_PREREQUISITE_CONTEXTINFO); 041 return Collections.unmodifiableSet(prereqs); 042 } 043 044 @Override 045 public String getOutput() { 046 return KSKRMSServiceConstants.TERM_RESOLVER_COMPLETEDCOURSEBETWEENTERMS; 047 } 048 049 @Override 050 public Set<String> getParameterNames() { 051 Set<String> parameters = new HashSet<String>(2); 052 parameters.add(KSKRMSServiceConstants.TERM_PARAMETER_TYPE_CLU_KEY); 053 parameters.add(KSKRMSServiceConstants.TERM_PARAMETER_TYPE_TERM_KEY); 054 parameters.add(KSKRMSServiceConstants.TERM_PARAMETER_TYPE_TERM2_KEY); 055 return Collections.unmodifiableSet(parameters); 056 } 057 058 @Override 059 public int getCost() { 060 return 0; 061 } 062 063 @Override 064 public Boolean resolve(Map<String, Object> resolvedPrereqs, Map<String, String> parameters) throws TermResolutionException { 065 ContextInfo context = (ContextInfo) resolvedPrereqs.get(KSKRMSServiceConstants.TERM_PREREQUISITE_CONTEXTINFO); 066 String personId = (String) resolvedPrereqs.get(KSKRMSServiceConstants.TERM_PREREQUISITE_PERSON_ID); 067 068 try { 069 //Retrieve the start and end term. 070 String startTermId = parameters.get(KSKRMSServiceConstants.TERM_PARAMETER_TYPE_TERM_KEY); 071 AtpInfo startTerm = this.getAtpService().getAtp(startTermId, context); 072 073 String endTermId = parameters.get(KSKRMSServiceConstants.TERM_PARAMETER_TYPE_TERM2_KEY); 074 AtpInfo endTerm = this.getAtpService().getAtp(endTermId, context); 075 076 //Retrieve the version independent clu id. 077 List<String> courseIds = this.getCluIdsTermResolver().resolve(resolvedPrereqs, parameters); 078 for(String courseId : courseIds){ 079 //Retrieve the students academic record for this version. 080 List<StudentCourseRecordInfo> courseRecords = this.getAcademicRecordService().getCompletedCourseRecordsForCourse(personId, courseId, context); 081 for (StudentCourseRecordInfo courseRecord : courseRecords){ 082 parameters.put(KSKRMSServiceConstants.TERM_PARAMETER_TYPE_CO_KEY, courseRecord.getCourseOfferingId()); 083 AtpInfo atpInfo = this.getAtpForCOIdTermResolver().resolve(resolvedPrereqs, parameters); 084 if((atpInfo.getStartDate().before(startTerm.getStartDate())) || (atpInfo.getEndDate().after(endTerm.getEndDate()))){ 085 continue; 086 } 087 return true; 088 } 089 } 090 } catch (Exception e) { 091 KSKRMSExecutionUtil.convertExceptionsToTermResolutionException(parameters, e, this); 092 } 093 094 return false; 095 } 096 097 public AcademicRecordService getAcademicRecordService() { 098 return academicRecordService; 099 } 100 101 public void setAcademicRecordService(AcademicRecordService academicRecordService) { 102 this.academicRecordService = academicRecordService; 103 } 104 105 public AtpService getAtpService() { 106 return atpService; 107 } 108 109 public void setAtpService(AtpService atpService) { 110 this.atpService = atpService; 111 } 112 113 public TermResolver<AtpInfo> getAtpForCOIdTermResolver() { 114 return atpForCOIdTermResolver; 115 } 116 117 public void setAtpForCOIdTermResolver(TermResolver<AtpInfo> atpForCOIdTermResolver) { 118 this.atpForCOIdTermResolver = atpForCOIdTermResolver; 119 } 120 121 public TermResolver<List<String>> getCluIdsTermResolver() { 122 return cluIdsTermResolver; 123 } 124 125 public void setCluIdsTermResolver(TermResolver<List<String>> cluIdsTermResolver) { 126 this.cluIdsTermResolver = cluIdsTermResolver; 127 } 128}