2020-08-29 20:01:41 +00:00
const szak = document . getElementById ( "szak" ) ;
const lk = document . getElementById ( "leckekonyv" ) ;
2021-01-04 15:35:17 +00:00
promiseOnLoad = async loadable => new Promise ( ( ( resolve , reject ) => ( loadable . onload = ev => resolve ( ev ) ) && ( loadable . onerror = ev => reject ( ev ) ) ) ) ;
parseExcel = async function ( file ) {
try {
2021-01-06 16:33:22 +00:00
if ( ! file || szak . value === "nope" ) return ;
2021-01-25 16:09:10 +00:00
grades = { } ;
2021-01-04 15:35:17 +00:00
const reader = new FileReader ( ) ;
const evpr = promiseOnLoad ( reader ) ;
reader . readAsBinaryString ( file ) ;
const ev = await evpr ;
const data = ev . target . result ;
2020-08-29 20:01:41 +00:00
const workbook = XLSX . read ( data , {
type : 'binary'
} ) ;
workbook . SheetNames . forEach ( function ( sheetName ) {
2021-01-04 16:01:58 +00:00
const rows = XLSX . utils . sheet _to _row _object _array ( workbook . Sheets [ sheetName ] ) ;
for ( const row of rows ) {
2021-01-06 16:33:22 +00:00
let id = row [ "Tárgykód" ] ;
2021-01-06 18:53:18 +00:00
const name = row [ "Tárgy címe, előadó neve" ] . replace ( /,.*/ , "" ) ;
2021-01-06 16:33:22 +00:00
if ( ! id . startsWith ( "IB0" ) )
2021-01-06 18:53:18 +00:00
id = id . replaceAll ( /[‑ -]\d{5}/g , "" ) ;
id = id . replaceAll ( /‑ /g , "-" ) ;
id = name . indexOf ( "tehetséggondozó" ) !== - 1 ? id + "-TG" : id ;
let subject = subjects [ id ] ;
2021-01-04 21:24:52 +00:00
if ( ! subject ) {
2021-01-06 18:53:18 +00:00
if ( id . startsWith ( "X" ) )
subject = new SubjectData ( id , name , 0 , [ szabvalCat ] ) ;
else {
console . warn ( "Subject not found: " + id + " " + name ) ;
continue ;
}
2021-01-04 21:24:52 +00:00
}
let grade = /\((\d)\)(?!.*\(\d\))/ . exec ( row [ "Jegyek" ] ) ;
2021-01-06 19:26:55 +00:00
if ( grade == null ) {
const sign = row [ "Aláírás" ] ;
if ( ! sign )
continue ;
grade = [ , sign . startsWith ( "Aláírva" ) ? 5 : 1 ] ;
}
2021-01-25 17:43:05 +00:00
let semester = Semester . parse ( row [ "Félév" ] ) ;
2021-01-04 21:24:52 +00:00
subject . grade = + grade [ 1 ] ;
subject . credit = + row [ "Kr." ] ;
2021-01-25 17:43:05 +00:00
subject . semester = semester ;
2021-01-04 21:24:52 +00:00
grades [ id ] = subject ;
2021-01-04 16:01:58 +00:00
}
const specsSpan = document . getElementById ( "specs" ) ;
2021-01-04 21:24:52 +00:00
const total = { } ;
for ( const sub of Object . values ( grades ) ) {
for ( const category of sub . categories ) {
if ( sub . grade <= 1 ) continue ;
if ( total [ category . id ] === undefined )
total [ category . id ] = sub . credit ;
else
total [ category . id ] += sub . credit ;
}
}
2021-01-06 18:53:18 +00:00
const print = ( cat , name , total , needed ) => specsSpan . innerHTML += name + ": " + total + "/" + ( needed ? ? cat . neededCredit ) + "<br />" ;
2021-01-04 21:24:52 +00:00
specsSpan . innerHTML = "" ;
2021-01-06 18:53:18 +00:00
let kotvalTotal = 0 ;
for ( const spec of specs ) {
specsSpan . innerHTML += "<h3>" + spec . name + "</h3>" ;
const kvs = { "Matekos tárgyak" : spec . matcat , "Infós tárgyak" : spec . infcat } ;
let kextra = 0 ;
const neededExtra = 52 - spec . matcat . neededCredit - spec . infcat . neededCredit ;
for ( const key of Object . keys ( kvs ) ) {
const value = kvs [ key ] ;
let tot = total [ value . id ] ;
if ( spec === kotvalSpec )
kotvalTotal += tot ;
if ( spec !== kotSpec && neededExtra !== 0 ) {
if ( tot > value . neededCredit ) {
kextra += tot - value . neededCredit ;
tot = value . neededCredit ;
}
}
print ( value , key , tot ) ;
}
if ( spec !== kotSpec ) {
if ( neededExtra !== 0 ) {
print ( kotvalEgyebCat , kotvalEgyebCat . name , kextra , neededExtra ) ;
}
let szt = 0 ;
if ( spec !== kotvalSpec ) {
szt = kotvalTotal - total [ spec . matcat . id ] - total [ spec . infcat . id ] ;
if ( neededExtra !== 0 )
szt -= kextra ;
}
print ( szabvalCat , szabvalCat . name , ( total [ szabvalCat . id ] ? ? 0 ) + szt ) ;
2021-01-06 19:26:55 +00:00
} else {
print ( szakdogaCat , szakdogaCat . name , total [ szakdogaCat . id ] ? ? 0 ) ;
specsSpan . innerHTML += szakmaiCat . name + ": " + ( Object . values ( grades ) . find ( cv => cv . categories . indexOf ( szakmaiCat ) !== - 1 && cv . grade > 1 ) ? "Teljesitve" : "Nincs teljesitve" ) + "<br />" ;
specsSpan . innerHTML += "Testnevelés: " + Object . values ( grades ) . reduce ( ( pv , cv ) => cv . id . startsWith ( "XT" ) && cv . grade === 5 ? pv + 1 : pv , 0 ) + "/2 félév" ; //TODO: Különböző félévben
2021-01-06 18:53:18 +00:00
}
2021-01-04 21:24:52 +00:00
}
2021-01-25 17:43:05 +00:00
let semester = Semester . current ( ) ;
2021-01-25 20:05:38 +00:00
specsSpan . innerHTML += getKKI ( semester ) ;
if ( semester . num === 2 ) semester . num -- ;
else {
semester . firstYear -- ;
semester . num ++ ;
2021-01-25 17:43:05 +00:00
}
2021-01-25 20:05:38 +00:00
specsSpan . innerHTML += getKKI ( semester ) ;
2021-01-04 15:35:17 +00:00
} ) ;
2021-01-06 19:26:55 +00:00
} catch ( ex ) {
2020-08-29 20:01:41 +00:00
console . log ( ex ) ;
2021-01-04 15:35:17 +00:00
}
}
lk . onchange = async ( ) => await parseExcel ( lk . files [ 0 ] ) ;
szak . onchange = async ( ) => {
2020-08-29 20:01:41 +00:00
if ( szak . value === "nope" ) return ;
2021-01-25 16:09:10 +00:00
subjects = { } ;
specs = [ ... specsDef ] ;
2020-08-29 20:01:41 +00:00
let response = await fetch ( document . URL . substr ( 0 , document . URL . lastIndexOf ( '/' ) ) + '/data/' + szak . value + "_bsc.csv" ) ;
2021-01-03 23:20:56 +00:00
let data = await response . text ( ) ;
let obj = Papa . parse ( data ) ;
2021-01-04 15:35:17 +00:00
const szakError = document . getElementById ( "szakError" ) ;
szakError . innerText = "" ;
if ( obj . errors . length > 0 ) {
for ( const error of obj . errors )
szakError . innerHTML += error . type + " - " + error . code + ": " + error . message + "<br />" ;
return ;
}
let cat ;
for ( let i = 2 ; i < obj . data . length ; i ++ ) { //2: Skip header
const sdata = obj . data [ i ] ;
if ( sdata . length < 10 )
continue ;
if ( sdata [ 5 ] . length === 0 ) { //Course type, only present at leaf nodes
let tempcat = tryGetCat ( sdata [ 1 ] ) ;
2021-01-04 21:24:52 +00:00
if ( tempcat !== undefined ) {
2021-01-04 15:35:17 +00:00
cat = tempcat ;
2021-01-04 21:24:52 +00:00
if ( cat . spec && cat . spec !== kotSpec && cat . spec !== kotvalSpec )
cat . neededCredit = + sdata [ 9 ] ;
}
2021-01-06 16:33:22 +00:00
if ( sdata [ 2 ] . indexOf ( "specializáció" ) !== - 1 ) {
const spec = new Specialization ( sdata [ 1 ] , sdata [ 2 ] ,
new SubjectCategory ( sdata [ 1 ] + "‑ MATSZT" , sdata [ 2 ] + " matekos tárgyak" , 0 ) ,
new SubjectCategory ( sdata [ 1 ] + "‑ INF" , sdata [ 2 ] + " infós tárgyak" ) , 0 ) ;
specs . push ( spec ) ;
}
/ * i f ( s d a t a [ 2 ] . i n d e x O f ( " S p e c i á l k o l l é g i u m " ) ! = = - 1 ) {
speck . push ( sdata [ 1 ] . replaceAll ( "TE‑ " , "" ) ) ;
} * /
2021-01-04 15:35:17 +00:00
continue ;
}
if ( cat === undefined ) {
console . warn ( "No category found!" ) ;
continue ;
}
2021-01-06 16:33:22 +00:00
let id = sdata [ 1 ] ;
if ( ! id . startsWith ( "IB0" ) ) //IB0: speckol and such
2021-01-06 18:53:18 +00:00
id = id . replaceAll ( /[‑ -]\d{5}/g , "" ) ;
id = id . replaceAll ( /‑ /g , "-" ) ;
2021-01-04 21:24:52 +00:00
id = sdata [ 2 ] . indexOf ( "tehetséggondozó" ) !== - 1 ? id + "-TG" : id ;
if ( ! subjects [ id ] )
subjects [ id ] = new SubjectData ( id , sdata [ 2 ] , sdata [ 8 ] , [ cat ] ) ;
else {
subjects [ id ] . categories . push ( cat ) ;
/ * i f ( s u b j e c t s [ i d ] . c r e d i t ! = = s d a t a [ 8 ] ) - T ö b b k ü l ö n b ö z ő k r e d i t - e l o s z l á s ú v e r z i ó i s l e h e t e g y t á r g y b ó l
console . warn ( "Credit amount differs for " + sdata [ 2 ] + ": " + subjects [ id ] . credit + " " + sdata [ 8 ] ) ; * /
}
2021-01-04 15:35:17 +00:00
}
for ( const spec of specs ) {
2021-01-04 21:24:52 +00:00
const count = Object . values ( subjects ) . reduce ( ( pv , cv ) => cv . categories . reduce ( ( pcv , ccv ) => pcv || ccv . spec === spec , false ) ? pv + 1 : pv , 0 ) ;
2021-01-04 16:01:58 +00:00
console . log ( spec . name + ": " + count ) ;
2021-01-04 15:35:17 +00:00
}
2021-01-04 21:24:52 +00:00
const count = Object . values ( subjects ) . reduce ( ( pv , cv ) => cv . categories . reduce ( ( pcv , ccv ) => pcv || ccv . spec === null , false ) ? pv + 1 : pv , 0 ) ;
2021-01-04 16:01:58 +00:00
console . log ( "Egyéb tárgyak: " + count ) ;
2021-01-06 16:33:22 +00:00
if ( lk . files [ 0 ] )
await lk . onchange ( undefined ) ;
2020-08-29 20:01:41 +00:00
} ;
2021-01-04 15:35:17 +00:00
function tryGetCat ( categoryID ) {
const spec = specs . find ( spec => spec . matcat . id === categoryID || spec . infcat . id === categoryID )
return ( spec && ( spec . matcat . id === categoryID ? spec . matcat : spec . infcat ) ) || [
kotvalEgyebCat ,
szakdogaCat ,
szakmaiCat ,
szabvalCat
] . find ( cat => cat . id === categoryID ) ;
}
2021-01-25 20:05:38 +00:00
function getKKI ( semester ) {
let totalCred = 0 , passedCred = 0 , totalNum = 0 ;
for ( const grade of Object . values ( grades ) ) {
if ( grade . semester . firstYear === semester . firstYear && grade . semester . num === semester . num ) {
if ( grade . grade > 1 ) {
passedCred += grade . credit ;
totalNum += grade . credit * grade . grade ;
}
totalCred += grade . credit ;
}
}
return "<br />" + semester . firstYear + "/" + ( semester . firstYear + 1 - 2000 ) + "/" + semester . num + " KKI (ösztöndijhoz): " + ( totalNum / 30.0 * passedCred / totalCred ) ;
}
2021-01-04 16:01:58 +00:00
let subjects = { } ;
2021-01-25 16:09:10 +00:00
let specs = [ ] ;
let specsDef = [
2021-01-04 15:35:17 +00:00
kotSpec ,
kotvalSpec
] ;
2021-01-04 16:01:58 +00:00
let grades = { } ;
2021-01-04 15:35:17 +00:00
( async ( ) => {
await szak . onchange ( undefined ) ;
}
) ( ) ;