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}