app/imports/api/academic-term/AcademicTermUtilities.ts
import _ from 'lodash';
import moment from 'moment';
import { AcademicTerm } from '../../typings/radgrad';
import { AcademicTerms } from './AcademicTermCollection';
import { RadGradProperties } from '../radgrad/RadGradProperties';
/**
* Defines the academic terms for the given year.
* @param {number} year the year.
*/
const defineAcademicTermsForYear = (year: number): void => {
// console.log(`Defining terms for ${year}`);
AcademicTerms.define({ term: AcademicTerms.SPRING, year });
AcademicTerms.define({ term: AcademicTerms.SUMMER, year });
AcademicTerms.define({ term: AcademicTerms.FALL, year });
if (RadGradProperties.getQuarterSystem()) {
AcademicTerms.define({ term: AcademicTerms.WINTER, year });
}
};
/**
* Defines default academicTerms for last year plus 4 more years.
* @memberOf api/academic-term
*/
export const defineAcademicTerms = (): void => {
let year = moment().year() - 1;
for (let i = 0; i < 5; i++) {
defineAcademicTermsForYear(year);
year++;
}
};
/**
* Ensures that there are AcademicTerms for the next 4 years.
*/
export const ensureFutureAcademicTerms = (): void => {
let year = moment().year();
for (let i = 0; i < 4; i++) {
defineAcademicTermsForYear(year);
year++;
}
};
/**
* Returns the next AcademicTerm document given an AcademicTerm document.
* @param termDoc the AcademicTerm doc.
* @returns The next AcademicTerm doc.
* @memberOf api/academic-term
*/
export const nextAcademicTerm = (termDoc: AcademicTerm): AcademicTerm => {
const currentTerm = termDoc.term;
const currentYear = termDoc.year;
let term;
let year = currentYear;
if (currentTerm === AcademicTerms.FALL) {
if (RadGradProperties.getQuarterSystem()) {
term = AcademicTerms.WINTER;
} else {
term = AcademicTerms.SPRING;
year += 1;
}
} else if (currentTerm === AcademicTerms.WINTER) {
term = AcademicTerms.SPRING;
} else if (currentTerm === AcademicTerms.SPRING) {
term = AcademicTerms.SUMMER;
} else {
term = AcademicTerms.FALL;
}
return AcademicTerms.findDoc(AcademicTerms.define({ term, year }));
};
/**
* Returns the next Fall, Winter or Spring academic term doc. Skips over Summer academic terms.
* @param term the academic term doc.
* @returns The next academic term doc (excluding summer).
* @memberOf api/academic-term
*/
export const nextNonSummerTerm = (term: AcademicTerm): AcademicTerm => {
let next: AcademicTerm = nextAcademicTerm(term);
if (next.term === AcademicTerms.SUMMER) {
next = nextAcademicTerm(next);
}
return next;
};
/**
* Returns an array of the upcoming academicTerms.
* @return {array} of the upcoming academicTerms.
* @memberOf api/academic-term
*/
export const upComingTerms = (): AcademicTerm[] => {
const currentTerm = AcademicTerms.getCurrentAcademicTermDoc();
const nine = currentTerm.termNumber + 10;
return _.sortBy(AcademicTerms.find({
termNumber: {
$gt: currentTerm.termNumber,
$lt: nine,
},
}).fetch(), (sem) => sem.termNumber);
};
export const termIDsToString = (termIDs: string[]): string[] => {
const retVal = [];
termIDs.forEach((id) => {
retVal.push(AcademicTerms.toString(id));
});
return retVal;
};