attestation-to-examiner-distribution
Version:
An API to calculate the precedence diagram method
198 lines (197 loc) • 8.12 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const JSONToGraph_1 = __importDefault(require("./JSONToGraph"));
const csv = require('csvtojson');
class ParseStudIPCSVToJSON {
static getAllTutorsDict(nodes) {
let tutors = {};
for (const element of nodes) {
let node = element;
let tutor = ParseStudIPCSVToJSON.getTutorFromNode(node);
if (tutor != undefined) {
// @ts-ignore
if (!tutors[tutor]) {
// @ts-ignore
tutors[tutor] = {};
}
// @ts-ignore
let slotForTutor = ParseStudIPCSVToJSON.getSlotFromNode(node);
// @ts-ignore
if (!tutors[tutor][slotForTutor.day]) {
// @ts-ignore
tutors[tutor][slotForTutor.day] = {};
}
// @ts-ignore
tutors[tutor][slotForTutor.day][slotForTutor.time] = true;
}
}
return tutors;
}
static getTutorFromNode(node) {
let ort = node["Ort"];
return ort;
}
static getSlotFromNode(node) {
let datum = node["Datum"];
let splits = datum.split(".");
let date = new Date();
date.setFullYear(parseInt(splits[2]), parseInt(splits[1]) - 1, parseInt(splits[0]));
// date.setDate(parseInt(splits[0]))
// date.setFullYear(parseInt(splits[2]))
// date.setMonth(parseInt(splits[1]) - 1)
let day = ParseStudIPCSVToJSON.getWeekday(date);
let tutor = ParseStudIPCSVToJSON.getTutorFromNode(node);
let slot = {
tutor: tutor,
day: day,
time: node["Beginn"],
};
return slot;
}
static getWeekday(date) {
return JSONToGraph_1.default.getWeekdayByNumber(date.getDay());
}
static getAllGroups(nodes) {
let groups = {};
let tutorSlotToGroupMembersInformations = {};
// since not all group members are in the same row, we need to collect them first
for (const element of nodes) {
let node = element;
let slotsForGroup = ParseStudIPCSVToJSON.getSlotFromNode(node);
let tutor = slotsForGroup.tutor;
let day = slotsForGroup.day;
let time = slotsForGroup.time;
let slotId = tutor + "-" + day + "-" + time; // get the slot id
// @ts-ignore
let tutorSlotToGroupMembersInformation = tutorSlotToGroupMembersInformations[slotId] || {
slot: slotsForGroup,
groupMembers: []
};
let members = tutorSlotToGroupMembersInformation.groupMembers;
let groupMembers = ParseStudIPCSVToJSON.getGroupMembersFromNode(node); // get the group member
if (!!groupMembers && groupMembers.length > 0) {
for (const groupMember of groupMembers) {
members.push(groupMember); // add the group member to the list of group members
}
tutorSlotToGroupMembersInformation.groupMembers = members;
}
// @ts-ignore
tutorSlotToGroupMembersInformations[slotId] = tutorSlotToGroupMembersInformation;
}
let slotKeys = Object.keys(tutorSlotToGroupMembersInformations);
for (const slotKey of slotKeys) {
// @ts-ignore
let tutorSlotToGroupMembersInformation = tutorSlotToGroupMembersInformations[slotKey];
let slotsForGroup = tutorSlotToGroupMembersInformation.slot;
let groupMembers = tutorSlotToGroupMembersInformation.groupMembers;
if (groupMembers != undefined && groupMembers.length > 0) {
let groupId = groupMembers.join(" & ");
// @ts-ignore
if (!groups[groupId]) {
// @ts-ignore
groups[groupId] = {};
}
// @ts-ignore
groups[groupId]["members"] = groupMembers;
// @ts-ignore
if (!groups[groupId]["selectedSlot"]) {
// @ts-ignore
groups[groupId]["selectedSlot"] = slotsForGroup;
}
// @ts-ignore
if (!groups[groupId]["possibleSlots"]) {
// @ts-ignore
groups[groupId]["possibleSlots"] = {};
}
// @ts-ignore
if (!groups[groupId]["possibleSlots"][slotsForGroup.day]) {
// @ts-ignore
groups[groupId]["possibleSlots"][slotsForGroup.day] = {};
}
// @ts-ignore
groups[groupId]["possibleSlots"][slotsForGroup.day][slotsForGroup.time] = true;
}
}
return groups;
}
static getGroupMembersFromNode(node) {
let person = node["Person"];
console.log("person: " + JSON.stringify(person));
if (person == "") {
return undefined;
}
if (person.length > 0) {
if (person.includes("\n")) {
let parts = person.split("\n");
return parts;
}
return [person];
}
return undefined;
}
static getTutorFromSlot(slot) {
let parts = slot.split("-");
return parts[2];
}
static parseStudIPCSVToJSON(s) {
return __awaiter(this, void 0, void 0, function* () {
let output = yield csv({ delimiter: ";" }).fromString(s);
let result = {
groups: {},
tutors: {},
tutorMultipliers: {},
};
let tutorDicts = ParseStudIPCSVToJSON.getAllTutorsDict(output);
// @ts-ignore
result.tutors = tutorDicts;
let tutorNames = Object.keys(tutorDicts);
for (const tutorName of tutorNames) {
// @ts-ignore
result.tutorMultipliers[tutorName] = 1;
}
let groupDicts = ParseStudIPCSVToJSON.getAllGroups(output);
// @ts-ignore
result.groups = groupDicts;
return result;
});
}
static getGroupsForTutors(parsedAsJSON) {
if (!parsedAsJSON) {
return {};
}
let tutorNames = Object.keys(parsedAsJSON.tutors);
let tutorsWithGroups = {};
let groupNames = Object.keys(parsedAsJSON.groups);
for (const groupName of groupNames) {
let group = parsedAsJSON.groups[groupName];
let tutorName = group.selectedSlot.tutor;
if (tutorName != undefined) {
// @ts-ignore
if (!tutorsWithGroups[tutorName]) {
// @ts-ignore
tutorsWithGroups[tutorName] = [];
}
// @ts-ignore
tutorsWithGroups[tutorName].push({
group: groupName,
day: group.selectedSlot.day,
time: group.selectedSlot.time,
});
}
}
return tutorsWithGroups;
}
}
exports.default = ParseStudIPCSVToJSON;