[Backend] Extract types for StudyTrackStats

This commit is contained in:
Riku Rauhala
2025-03-11 13:46:13 +02:00
parent 3bbee5c0b3
commit bf780d09d7
4 changed files with 72 additions and 32 deletions
@@ -6,10 +6,7 @@ import { getGraduationStats, getStudyTrackStats, setGraduationStats, setStudyTra
import { getGraduationStatsForStudyTrack, GraduationTimes } from '../studyProgramme/studyProgrammeGraduations'
import { getMedian } from '../studyProgramme/studyProgrammeHelpers'
import { getStudyRightsInProgramme } from '../studyProgramme/studyRightFinders'
import {
getStudyTrackStatsForStudyProgramme,
ProgrammeOrStudyTrackGraduationStats,
} from '../studyProgramme/studyTrackStats'
import { getStudyTrackStatsForStudyProgramme } from '../studyProgramme/studyTrackStats'
import type { ProgrammesOfOrganization } from './faculty'
export type LevelGraduationStats = Omit<GraduationTimes['medians'][number], 'y'> & { median: number }
@@ -161,7 +158,7 @@ const getStatsByStartYear = async (facultyProgrammes: ProgrammesOfOrganization)
const { degreeProgrammeType, progId, code } = facultyProgrammes.find(({ code }) => code === programmeCode)!
const level = programmeTypes[degreeProgrammeType as keyof typeof programmeTypes]
if (!(programmeCode in graduationTimes)) continue
const statsForProgramme = graduationTimes[programmeCode] as ProgrammeOrStudyTrackGraduationStats
const statsForProgramme = graduationTimes[programmeCode]
const basicStats = statsForProgramme.medians.basic
const comboStats = statsForProgramme.medians.combo
const classSizesByYear = basicStats.reduce<Record<string, number>>(
@@ -2,6 +2,7 @@ import moment from 'moment'
import { InferAttributes } from 'sequelize'
import { Credit, SISStudyRight, SISStudyRightElement } from '../../models'
import { GraduationTimes, MedianEntry, ProgrammeOrStudyTrackGraduationStats, StudyTrackStats } from '../../shared/types'
import { GenderCode, EnrollmentType, ExtentCode, SemesterEnrollment } from '../../types'
import { createLocaleComparator, keysOf } from '../../util'
import { countTimeCategories } from '../graduationHelpers'
@@ -22,19 +23,6 @@ import {
} from './studyProgrammeHelpers'
import { getStudyTracksForProgramme } from './studyRightFinders'
type MedianEntry = {
amount: number
classSize: number
name: string
statistics: ReturnType<typeof countTimeCategories>
y: number
times: number[]
}
export type ProgrammeOrStudyTrackGraduationStats = {
medians: { basic: MedianEntry[]; combo: MedianEntry[] }
}
const getCreditCount = (credits: Credit[], startDate: Date) =>
credits
.filter(credit => moment(credit.attainment_date).isSameOrAfter(startDate))
@@ -47,15 +35,8 @@ const getGraduationTimeStats = async (
mainStatsByTrack: ReturnType<typeof combineStats>['mainStatsByTrack'],
combinedProgramme?: string
) => {
type Goals = { basic: number; combo: number }
type GraduationTimes = {
goals: Goals
[programmeOrStudyTrack: string]: ProgrammeOrStudyTrackGraduationStats | Goals
}
const goal = await getGoal(combinedProgramme ?? studyProgramme)
const finalGraduationTimes: GraduationTimes = { goals: { basic: goal, combo: goal + 36 } }
const finalGraduationTimes = { goals: { basic: goal, combo: goal + 36 } }
const calculateGraduationTimes = (
graduationTimes: Record<string, Record<string, number[]>>,
@@ -92,7 +73,7 @@ const getGraduationTimeStats = async (
calculateGraduationTimes(graduationTimes, 'basic')
calculateGraduationTimes(graduationTimesCombo, 'combo')
return finalGraduationTimes
return finalGraduationTimes as GraduationTimes
}
const getEmptyYear = () => ({
@@ -501,13 +482,21 @@ export const getStudyTrackStatsForStudyProgramme = async ({
return tableTitles.studytracksCombined.master
}
const graduatedTitles = combinedProgramme ? getCorrectCombinedTitles() : tableTitles.studytracksBasic
return {
id: combinedProgramme ? `${studyProgramme}-${combinedProgramme}` : studyProgramme,
years,
...stats,
const studyTrackStats: StudyTrackStats = {
creditCounts: stats.creditCounts,
creditCountsCombo: stats.creditCountsCombo,
doCombo,
studyTracks,
graduationTimes: stats.graduationTimes,
graduationTimesSecondProg: stats.graduationTimesSecondProg,
id: combinedProgramme ? `${studyProgramme}-${combinedProgramme}` : studyProgramme,
includeGraduated: settings.graduated,
mainStatsByTrack: stats.mainStatsByTrack,
mainStatsByYear: stats.mainStatsByYear,
otherCountriesCount: stats.otherCountriesCount,
populationTitles: [...tableTitles.studytracksStart, ...graduatedTitles, ...tableTitles.studytracksEnd],
studyTracks,
years,
}
return studyTrackStats
}
+6
View File
@@ -11,4 +11,10 @@ export type {
export type { Name, NameWithCode } from './name'
export type { Release } from './release'
export type { Role } from './role'
export type {
GraduationTimes,
MedianEntry,
ProgrammeOrStudyTrackGraduationStats,
StudyTrackStats,
} from './studyProgramme'
export type { NewTag, StudentTag, Tag } from './tag'
+48
View File
@@ -0,0 +1,48 @@
import { Name } from './name'
export type MedianEntry = {
amount: number
classSize: number
name: string
statistics: {
onTime: number
yearOver: number
wayOver: number
}
times: number[]
y: number
}
export type ProgrammeOrStudyTrackGraduationStats = {
medians: {
basic: MedianEntry[]
combo: MedianEntry[]
}
}
export type Goals = {
basic: number
combo: number
}
export type GraduationTimes = {
goals: Goals
} & {
[programmeOrStudyTrack: string]: ProgrammeOrStudyTrackGraduationStats
}
export type StudyTrackStats = {
creditCounts: Record<string, number[]>
creditCountsCombo: Record<string, number[]>
doCombo: boolean
graduationTimes: GraduationTimes
graduationTimesSecondProg: GraduationTimes
id: string
includeGraduated: boolean
mainStatsByTrack: Record<string, (number | string)[][]>
mainStatsByYear: Record<string, (number | string)[][]>
otherCountriesCount: Record<string, Record<string, Record<string, number>>>
populationTitles: string[]
studyTracks: Record<string, string | Name>
years: string[]
}