public async Task <Course> FindCourseTimetableFromProxy(Course course) { List <ScheduleTimetableResult> schedules = new(); int years = course.StudyType.Contains("inž") ? 2 : 3; for (int i = 1; i <= years; i++) { try { ScheduleTimetableResult schedule = await _scheduleProxy.GetBySubjectCode(course.CourseCode, i + "", course.StudyType); if (schedule != null) { schedules.Add(schedule); } } catch (Exception ex) { _logger.LogWarning($"Error while searching timetable of course {course.CourseName}({course.CourseCode}): {ex.Message}"); } if (schedules == null) { _logger.LogError($"Unable to load schedule for subject {course.CourseCode}. Schedule proxy returned null"); return(null); } } course.Timetable = new Timetable(Semester.GetSemester()); schedules.ForEach(async(schedule) => { Timetable t = await ConverterApiToDomain.ConvertTimetableForCourseAsync(schedule, this); if (t != null) { foreach (Block b in t.AllBlocks) { if (!course.Timetable.ContainsBlock(b)) { course.Timetable.AddNewBlock(b); } } } }); course.LastUpdateOfTimetable = DateTime.Now; await UpdateAsync(course); return(course); }
public static async Task <Timetable> ConvertAndMergeSameConsecutiveBlocks(ScheduleTimetableResult scheduleTimetable, ICourseService courseService, bool isTimetableForCourse) { var sortedBlocks = scheduleTimetable.Result.ScheduleContents .OrderBy(b => b.Day) .ThenBy(b => b.CourseName) .ThenBy(b => b.TeacherName) .ThenBy(b => b.RoomName) .ThenBy(b => b.LessonType) .ThenBy(b => b.BlockNumber) .ToList(); IEnumerable <Task <Block> > mergedBlocks = Merge(sortedBlocks, (group, b2) => { ScheduleContent b1 = group.First(); return(b1.Day == b2.Day && b1.CourseName == b2.CourseName && b1.RoomName == b2.RoomName && b1.LessonType == b2.LessonType && (b1.BlockNumber == b2.BlockNumber - 1 || b1.BlockNumber == b2.BlockNumber)); // || b1.BlockNumber == b2.BlockNumber to eliminate duplicates (same blocks) }, async(group) => { ScheduleContent firstInGroup = group.First(); var teacherBuilder = new StringBuilder(); foreach (var item in group.Select(x => x.TeacherName).Distinct()) { if (string.IsNullOrEmpty(teacherBuilder.ToString())) { teacherBuilder.Append(item); } else { teacherBuilder.Append($", {item}"); } } var block = new Block() { BlockType = ConvertToBlockType(firstInGroup.LessonType), Day = ConvertToDay(firstInGroup.Day), Teacher = teacherBuilder.ToString(), Room = firstInGroup.RoomName, StartHour = (byte)(firstInGroup.BlockNumber + 6), // block number start 1 but starting hour in school is 7:00 Duration = (byte)(group.Last().BlockNumber - firstInGroup.BlockNumber + 1) }; if (!isTimetableForCourse) { Course course = await courseService.GetOrAddNotExistsCourse(firstInGroup.CourseCode, firstInGroup.CourseName); Block courseBlock = course.Timetable?.GetBlock(block); if (courseBlock != null) { block.BlockId = courseBlock.BlockId; } block.CourseId = course.Id; } return(block); } ); Timetable mergedTimetable = new(scheduleTimetable.Semester); foreach (var mergedBlock in mergedBlocks) { mergedTimetable.AddNewBlock(await mergedBlock); } return(mergedTimetable); }
public static async Task <Timetable> ConvertTimetableForCourseAsync(ScheduleTimetableResult timetable, ICourseService courseServ) { return(await ConvertAndMergeSameConsecutiveBlocks(timetable, courseServ, true)); }