protected override async Task HandleTimetableEvent(TimetableEvent @event, IIccOutput outputSettings)
        {
            Configure(outputSettings);
            tuitionResolver.Initialize();

            if (outputSettings.TimetablePeriodMapping == null)
            {
                logger.LogError("TimetablePeriodMapping is null. Do not upload timetable.");
                return;
            }

            var period = outputSettings.TimetablePeriodMapping.ContainsKey(@event.Period) ? outputSettings.TimetablePeriodMapping[@event.Period] : null;

            if (period == null)
            {
                logger.LogDebug($"Cannot resolve period {@event.Period}. Skip upload.");
                return;
            }

            var lessons = new List <TimetableLessonData>();

            try
            {
                logger.LogDebug("Group lessons by week, lesson, room, subject and teacher...");

                var groups = @event.Lessons.GroupBy(l => new { Weeks = string.Join(',', l.Weeks), l.Day, l.LessonStart, l.LessonEnd, l.Subject, l.Room });

                foreach (var group in groups)
                {
                    var teachers = new List <string>();
                    var tuitions = new Dictionary <string, string>();
                    var grades   = new List <string>();

                    foreach (var lesson in group)
                    {
                        if (!teachers.Contains(lesson.Teacher))
                        {
                            teachers.Add(lesson.Teacher);
                        }

                        if (!string.IsNullOrEmpty(lesson.Grade) && !grades.Contains(lesson.Grade))
                        {
                            grades.Add(lesson.Grade);
                            var resolvedTuition = tuitionResolver.ResolveTuition(lesson.Grade, lesson.Subject, lesson.Teacher);

                            if (resolvedTuition != null)
                            {
                                tuitions.Add(lesson.Grade, resolvedTuition);
                            }
                        }
                    }

                    var distinctTuitions = tuitions.Select(x => x.Value).Distinct().ToList();

                    if (distinctTuitions.Count > 1)
                    {
                        logger.LogDebug($"Found more than one tuition for lesson (day: {group.Key.Day}, weeks: {string.Join(',', group.Key.Weeks)}, lesson: {group.Key.LessonStart}, subject: {group.Key.Subject}, room: {group.Key.Room}, grades: { string.Join(',', grades)}.");
                    }

                    if (distinctTuitions.Count == 0)
                    {
                        logger.LogDebug($"Found no tuition for lesson (day: {group.Key.Day}, weeks: {string.Join(',', group.Key.Weeks)}, lesson: {group.Key.LessonStart}, subject: {group.Key.Subject}, room: {group.Key.Room}, grades: { string.Join(',', grades)}.");
                    }

                    var subject  = group.Key.Subject;
                    var duration = group.Key.LessonEnd - group.Key.LessonStart + 1;

                    foreach (var week in group.Key.Weeks.Split(','))
                    {
                        for (int i = 0; i < duration; i += 2)
                        {
                            var lessonStart = group.Key.LessonStart + i;
                            var lessonEnd   = Math.Min(lessonStart + 1, group.Key.LessonEnd);

                            if (distinctTuitions.Count > 1)
                            {
                                foreach (var kv in tuitions)
                                {
                                    lessons.Add(CreateTimetableLessonData(kv.Value, new List <string> {
                                        kv.Key
                                    }, teachers, lessonStart, lessonEnd, group.Key.Room, group.Key.Day, week, null));
                                }
                            }
                            else if (distinctTuitions.Count == 1)
                            {
                                lessons.Add(CreateTimetableLessonData(distinctTuitions.First(), grades, teachers, lessonStart, lessonEnd, group.Key.Room, group.Key.Day, week, null));
                            }
                            else
                            {
                                lessons.Add(CreateTimetableLessonData(null, grades, teachers, lessonStart, lessonEnd, group.Key.Room, group.Key.Day, week, subject));
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                logger.LogError(e, "Something went wrong while constructing all timetable lessons.");
                return;
            }

            var response = await iccImporter.ImportTimetableLessonsAsync(period, lessons);

            await HandleResponseAsync(response);
        }
Exemple #2
0
        public async Task <ImportResult> ImportTimetableAsync(UntisExportResult result, Period period)
        {
            ConfigureImporter();

            var lessons = new List <TimetableLessonData>();
            var subjectReplacementMap = settingsManager.AppSettings.SubjectOverrides.ToDictionary(x => x.UntisSubject, x => x.NewSubject);

            var bereit = result.Tuitions.Where(x => x.Periods.Any(y => y.Subject == "Bereit")).ToList();

            var allowedWeeks = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P" }; // Untis only allows a periodicity of 16

            foreach (var tuition in result.Tuitions)
            {
                foreach (var tuitionPeriod in tuition.Periods)
                {
                    if (tuitionPeriod.PeriodNumber != period.Number)
                    {
                        continue;
                    }

                    // Check if time frame is withing current period
                    if (tuitionPeriod.EndDate < period.Start || tuitionPeriod.StartDate > period.End)
                    {
                        continue;
                    }

                    foreach (var timetable in tuitionPeriod.Timetable)
                    {
                        var weeks = !string.IsNullOrEmpty(timetable.Week) ? new string[] { timetable.Week } : tuitionPeriod.TuitionGroups;

                        foreach (var week in weeks)
                        {
                            if (!allowedWeeks.Contains(week) || timetable.Day == 0 || timetable.Lesson == 0 || string.IsNullOrEmpty(tuitionPeriod.Subject))
                            {
                                // ??!?
                                continue;
                            }

                            var lesson = new TimetableLessonData
                            {
                                Day            = timetable.Day,
                                Lesson         = timetable.Lesson,
                                IsDoubleLesson = false,
                                Room           = timetable.Room,
                                Week           = week,
                                Id             = Guid.NewGuid().ToString(),
                                Grades         = tuitionPeriod.Grades,
                                Subject        = tuitionPeriod.Subject
                            };

                            if (!string.IsNullOrEmpty(tuitionPeriod.Teacher))
                            {
                                lesson.Teachers.Add(tuitionPeriod.Teacher);
                            }

                            var last = lessons.LastOrDefault();

                            if (last != null && last.Day == lesson.Day && last.Room == lesson.Room && last.Week == lesson.Week && last.Subject == lesson.Subject && last.IsDoubleLesson == false && last.Lesson == lesson.Lesson - 1)
                            {
                                last.IsDoubleLesson = true;
                                continue;
                            }

                            lessons.Add(lesson);
                        }
                    }
                }
            }

            var splitLessons = new List <TimetableLessonData>();

            foreach (var lesson in lessons)
            {
                if (lesson.Grades.Count == 0)
                {
                    continue;
                }

                if (settingsManager.AppSettings.SplitCourses.Any(x => x.Subject == lesson.Subject && lesson.Grades.Contains(x.Grade)))
                {
                    var firstGrade = lesson.Grades.First();
                    var grades     = lesson.Grades.Skip(1).ToList();
                    lesson.Grades = new List <string> {
                        firstGrade
                    };

                    foreach (var grade in grades)
                    {
                        var newLesson = new TimetableLessonData
                        {
                            Day            = lesson.Day,
                            Lesson         = lesson.Lesson,
                            IsDoubleLesson = lesson.IsDoubleLesson,
                            Room           = lesson.Room,
                            Week           = lesson.Week,
                            Id             = Guid.NewGuid().ToString(),
                            Grades         = new List <string> {
                                grade
                            },
                            Subject  = lesson.Subject,
                            Teachers = lesson.Teachers
                        };

                        splitLessons.Add(newLesson);
                    }
                }
            }

            lessons.AddRange(splitLessons);

            foreach (var lesson in lessons)
            {
                // Replace subject if necessary
                if (subjectReplacementMap.ContainsKey(lesson.Subject))
                {
                    lesson.Subject = subjectReplacementMap[lesson.Subject];
                }
            }

            var response = await importer.ImportTimetableLessonsAsync(period.Name, lessons);

            return(HandleResponse(response));
        }