52 lines
2.0 KiB
JavaScript
52 lines
2.0 KiB
JavaScript
import { preferredScheduleSemester } from './schedule-period.js';
|
|
|
|
export function academicYearsFromSemesters(semesters = []) {
|
|
const years = new Map();
|
|
semesters.forEach(semester => {
|
|
const id = String(semester?.academicYearId ?? '');
|
|
if (!id || years.has(id)) return;
|
|
years.set(id, {
|
|
id,
|
|
title: semester.academicYearTitle || `Учебный год ${id}`
|
|
});
|
|
});
|
|
return [...years.values()];
|
|
}
|
|
|
|
export function semestersForAcademicYear(semesters = [], academicYearId = '') {
|
|
return semesters.filter(semester =>
|
|
String(semester?.academicYearId ?? '') === String(academicYearId)
|
|
);
|
|
}
|
|
|
|
export function resolveAcademicPeriod(semesters = [], options = {}) {
|
|
if (!semesters.length) return { academicYearId: '', semesterId: '' };
|
|
|
|
const requestedSemester = semesters.find(semester =>
|
|
String(semester.id) === String(options.semesterId || '')
|
|
);
|
|
const availableYearIds = new Set(academicYearsFromSemesters(semesters).map(year => year.id));
|
|
const requestedYearId = availableYearIds.has(String(options.academicYearId || ''))
|
|
? String(options.academicYearId)
|
|
: '';
|
|
const preferred = preferredScheduleSemester(semesters, options.date || isoToday()) || semesters[0];
|
|
const academicYearId = requestedSemester
|
|
? String(requestedSemester.academicYearId)
|
|
: (requestedYearId || String(preferred?.academicYearId || semesters[0].academicYearId));
|
|
const yearSemesters = semestersForAcademicYear(semesters, academicYearId);
|
|
const semester = requestedSemester && String(requestedSemester.academicYearId) === academicYearId
|
|
? requestedSemester
|
|
: (preferredScheduleSemester(yearSemesters, options.date || isoToday()) || yearSemesters[0]);
|
|
|
|
return {
|
|
academicYearId,
|
|
semesterId: String(semester?.id || '')
|
|
};
|
|
}
|
|
|
|
function isoToday() {
|
|
const date = new Date();
|
|
const offset = date.getTimezoneOffset() * 60_000;
|
|
return new Date(date.getTime() - offset).toISOString().slice(0, 10);
|
|
}
|