// returns time difference in 15-minute intervalls
function timediff(a, b) {
const time = "1970-01-01 ";
return (new Date(time + a) - new Date(time + b)) / 1000 / 60 / 15;
}
function gettimefromintervalls(x) {
let y = 15 * x / 60 + 8
let z = y.toString().padStart(2, '0');
if (Math.round(y) == y) return `
${z}:00 | `;
return ""
}
function sortTage(tage) {
for (let tag in tage) {
tage[tag].sort((a, b) => {
return timediff(a.von, b.von)
});
}
return tage;
}
function runtimes(tage, tage_runtimes) {
for (let tag in tage) {
for (let eintrag in tage[tag]) {
// could be redundant
if (eintrag == tage[tag].length) break;
let a = tage[tag][eintrag];
let runtime = timediff(a.bis, a.von)
tage_runtimes[tag].push({
"name": a.name,
"raum": a.raum,
"runtime": runtime,
});
}
}
return tage_runtimes;
}
function bufferUp(tage) {
tage = sortTage(tage);
for (let tag in tage) {
if (tage[tag][0].von != "08:00") {
tage[tag].splice(0, 0, {
"name": "BUFFER",
"raum": "BUFFER",
"von": "08:00",
"bis": tage[tag][0].von,
})
}
if (tage[tag][tage[tag].length - 1].bis != "19:00") {
tage[tag].push({
"name": "BUFFER",
"raum": "BUFFER",
"von": tage[tag][tage[tag].length - 1].bis,
"bis": "19:00",
})
}
}
for (let tag in tage) {
for (let eintrag in tage[tag]) {
if (eintrag == tage[tag].length - 1) break;
let a = tage[tag][eintrag];
let b = tage[tag][eintrag - -1];
let runtime = timediff(b.von, a.bis)
if (runtime > 0) {
tage[tag].push({
"name": "BUFFER",
"raum": "BUFFER",
"von": a.bis,
"bis": b.von,
});
}
}
}
return tage;
}
class Eintrag {
constructor(name, termine) {
this.name = name;
this.termine = termine;
}
}
class Termin {
constructor(wochentag, raum, von, bis) {
this.wochentag = wochentag;
this.raum = raum;
this.von = von;
this.bis = bis;
}
}
const eintraege = [
new Eintrag("GET 2 / Ü", [
new Termin("Mo", "AM S4", "12:00", "13:00"),
new Termin("Fr", "AM S4", "11:30", "13:00")
]),
new Eintrag("GET 2 / V", [
new Termin("Di", "H1", "08:30", "10:00"),
new Termin("Do", "Z 1/2", "08:30", "10:00")
]),
new Eintrag("TGI 1 / V", [
new Termin("Mi", "AM 1", "08:15", "09:45"),
]),
new Eintrag("TGI 1 / Ü", [
new Termin("Do", "AM 1", "15:00", "16:00"),
]),
new Eintrag("TGI 1 / Prak. Gr. 2", [
new Termin("Di", "ITI 131", "14:30", "17:30"),
]),
new Eintrag("Pho / V", [
new Termin("Fr", "T 1", "08:30", "10:00"),
]),
new Eintrag("Pho / Ü", [
new Termin("Mi", "AM 1", "12:00", "13:00"),
]),
new Eintrag("Ana 2 / V", [
new Termin("Di", "AM 1", "12:30", "14:00"),
]),
new Eintrag("Ana 2 / Ü", [
new Termin("Do", "H 1", "16:15", "17:15"),
]),
new Eintrag("Ana 2 / Helpdesk", [
new Termin("Di", "O-Sync", "18:00", "19:00"),
new Termin("Mi", "O-Sync", "18:00", "19:00")
]),
new Eintrag("EiBMO / V", [
new Termin("Mi", "H 1", "14:00", "16:00"),
]),
new Eintrag("EiBMO / Ü", [
new Termin("Mi", "H 1", "16:00", "17:00"),
]),
new Eintrag("FuQ / V", [
new Termin("Fr", "AM 4", "10:00", "11:30"),
]),
new Eintrag("FuQ / Ü", [
new Termin("Di", "SI 4 (Minsky)", "11:00", "12:00"),
]),
new Eintrag("BLOCKED", [
new Termin("Mo", "BLOCKED", "13:00", "19:00"),
new Termin("Do", "BLOCKED", "10:00", "15:00")
])
];
const ctage = {
"Mo": [],
"Di": [],
"Mi": [],
"Do": [],
"Fr": []
}
export function main() {
let res = "";
let tage = structuredClone(ctage);
let tage_runtimes = structuredClone(ctage);
for (let eintrag of eintraege) {
for (let termin of eintrag.termine) {
tage[termin.wochentag].push({
"name": eintrag.name,
"raum": termin.raum,
"von": termin.von,
"bis": termin.bis,
})
}
}
tage = bufferUp(tage, ctage);
tage = sortTage(tage);
tage_runtimes = runtimes(tage, tage_runtimes)
let timeout = {}
// 1h has 4 15 minute intervalls: 08 to 19 means 44 intervalls
for (let i = 0; i < 44; i++) {
let mensa = "";
if (11 < i && i < 25) mensa = "mensa1";
if (25 < i && i < 27) mensa = "mensa2";
res += `` + gettimefromintervalls(i)
for (let day in tage_runtimes) {
if (timeout[day] > 0) {
timeout[day]--;
continue;
}
let el = tage_runtimes[day][0];
if (el.name == "BLOCKED" && el.raum == "BLOCKED") {
res += ` | `;
} else {
let name = el.name == "BUFFER" ? "" : `${el.name}`;
let raum = el.raum == "BUFFER" ? "" : `${el.raum}`;
res += `
${name}${raum} | `;
}
timeout[day] = el.runtime - 1;
tage_runtimes[day].splice(0, 1);
}
res += "
"
}
// console.log(res)
return res
}