コード例 #1
0
        public async Task <IActionResult> DragAndDropCourseChange([FromBody] DragDropCourseChangeViewModel DragDropCourseObj)
        {
            var result = new Result <object>();
            PeriodCourseChangeViewModel periodCourseChangeViewModel = new PeriodCourseChangeViewModel();

            periodCourseChangeViewModel.UserId    = DragDropCourseObj.UserId;
            periodCourseChangeViewModel.TeacherId = DragDropCourseObj.TeacherId;
            periodCourseChangeViewModel.LearnerId = DragDropCourseObj.LearnerId;
            periodCourseChangeViewModel.OrgId     = DragDropCourseObj.OrgId;
            // periodCourseChangeViewModel.BeginDate = DragDropCourseObj.BeginDate;
            periodCourseChangeViewModel.BeginTime = DragDropCourseObj.ChangedDate.TimeOfDay;
            periodCourseChangeViewModel.Reason    = DragDropCourseObj.Reason;

            var lesson = await _ablemusicContext.Lesson.Include(l => l.CourseInstance).
                         Include(l => l.CourseInstance).ThenInclude(c => c.CourseSchedule).
                         Where(l => l.LessonId == DragDropCourseObj.LessonId).FirstOrDefaultAsync();

            if (lesson == null)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = "Can not find this lesson!";
                return(BadRequest(result));
            }
            if (lesson.CourseInstanceId == null)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = "Group Lesson can not be changed!";
                return(BadRequest(result));
            }
            //get day of week
            short dayOfWeek = DayofWeekToInt(DragDropCourseObj.ChangedDate.DayOfWeek);

            periodCourseChangeViewModel.DayOfWeek = dayOfWeek;
            periodCourseChangeViewModel.BeginDate = lesson.BeginTime.Value;

            periodCourseChangeViewModel.InstanceId       = (int)lesson.CourseInstanceId;
            periodCourseChangeViewModel.CourseScheduleId = (int)lesson.CourseInstance.CourseSchedule.FirstOrDefault().CourseScheduleId;
            //if IsPermanent
            if (DragDropCourseObj.IsPermanent == 1)
            {
                periodCourseChangeViewModel.IsTemporary = 0;
            }
            else
            {
                var invoice = await _ablemusicContext.InvoiceWaitingConfirm.
                              FirstOrDefaultAsync(i => i.InvoiceNum == lesson.InvoiceNum);

                periodCourseChangeViewModel.EndDate     = invoice.EndDate;
                periodCourseChangeViewModel.IsTemporary = 1;
            }

            return(await PostPeriodCourseChangeService(periodCourseChangeViewModel));
        }
コード例 #2
0
        public static string PeriodCourseChange(string name, dynamic courseInfo, dynamic newCourseInfo, PeriodCourseChangeViewModel inputObj)
        {
            string mailContent = "<div><p>Dear " + name + "</p>" + "<p>This is to inform you that the course " + courseInfo.CourseName + " at " + courseInfo.OrgName + " " + courseInfo.RoomName + " from " +
                                 TimeConvertor.getDayOfWeek(courseInfo.DayOfWeek) + " " + courseInfo.BeginTime + " to " + courseInfo.EndTime + " has been changed to " +
                                 newCourseInfo.newOrg.OrgName + " " + newCourseInfo.newRoom.RoomName + " from " + inputObj.BeginTime + " to " + inputObj.EndTime +
                                 "on " + TimeConvertor.getDayOfWeek(inputObj.DayOfWeek) + " ";

            mailContent += inputObj.IsTemporary == 1 ? "for the period between " + inputObj.BeginDate + " to " +
                           inputObj.EndDate + " Temporarily" : "from " + inputObj.BeginDate + "permanently</p>";
            return(mailContent);
        }
コード例 #3
0
        public static string PeriodCourseChangeForTeacher(dynamic courseInfo, dynamic newCourseInfo, PeriodCourseChangeViewModel inputObj)
        {
            string content = "Inform teacher " + courseInfo.TeacherFirstName + " " + courseInfo.TeacherLastName +
                             " the course " + courseInfo.CourseName + " at " + courseInfo.OrgName + " " + courseInfo.RoomName + " from " +
                             TimeConvertor.getDayOfWeek(courseInfo.DayOfWeek) + " " + courseInfo.BeginTime + " to " + courseInfo.EndTime + " has been changed to " +
                             newCourseInfo.newOrg.OrgName + " " + newCourseInfo.newRoom.RoomName + " from " + inputObj.BeginTime + " to " + inputObj.EndTime +
                             "on " + TimeConvertor.getDayOfWeek(inputObj.DayOfWeek) + " ";

            return(content);
        }
コード例 #4
0
        public async Task <IActionResult> PostPeriodCourseChange([FromBody] PeriodCourseChangeViewModel inputObj)
        {
            var              result = new Result <List <object> >();
            List <Lesson>    exsitingLessons;
            Learner          learner;
            List <Holiday>   holidays;
            List <Amendment> exsitingAmendments;
            Amendment        amendment     = new Amendment();
            DateTime?        todoDateEnd   = null;
            DateTime         todoDateBegin = inputObj.BeginDate;
            List <Term>      terms;
            dynamic          courseInfo;
            dynamic          newCourseInfo;
            AvailableDays    availableDay;

            try
            {
                if (inputObj.EndDate.HasValue)
                {
                    exsitingLessons = await _ablemusicContext.Lesson.Where(l => l.LearnerId == inputObj.LearnerId && l.IsCanceled != 1 &&
                                                                           l.BeginTime.Value.Date <= inputObj.EndDate.Value.Date && l.BeginTime.Value.Date >= inputObj.BeginDate.Date &&
                                                                           l.CourseInstanceId == inputObj.InstanceId).ToListAsync();
                }
                else
                {
                    exsitingLessons = await _ablemusicContext.Lesson.Where(l => l.LearnerId == inputObj.LearnerId && l.IsCanceled != 1 &&
                                                                           l.BeginTime.Value.Date >= inputObj.BeginDate.Date).ToListAsync();
                }
                terms = await _ablemusicContext.Term.ToListAsync();

                courseInfo = await(from i in _ablemusicContext.One2oneCourseInstance
                                   join cs in _ablemusicContext.CourseSchedule on i.CourseInstanceId equals cs.CourseInstanceId
                                   join l in _ablemusicContext.Learner on i.LearnerId equals l.LearnerId
                                   join t in _ablemusicContext.Teacher on i.TeacherId equals t.TeacherId
                                   join c in _ablemusicContext.Course on i.CourseId equals c.CourseId
                                   join o in _ablemusicContext.Org on i.OrgId equals o.OrgId
                                   join r in _ablemusicContext.Room on i.RoomId equals r.RoomId
                                   where i.CourseInstanceId == inputObj.InstanceId && inputObj.CourseScheduleId == cs.CourseScheduleId
                                   select new
                {
                    OrgId      = i.OrgId,
                    OrgName    = o.OrgName,
                    RoomId     = i.RoomId,
                    RoomName   = r.RoomName,
                    CourseId   = i.CourseId,
                    CourseName = c.CourseName,
                    c.Duration,
                    TeacherId        = i.TeacherId,
                    TeacherFirstName = t.FirstName,
                    TeacherLastName  = t.LastName,
                    TeacherEmail     = t.Email,
                    LearnerId        = i.LearnerId,
                    LearnerFirstName = l.FirstName,
                    LearnerLastName  = l.LastName,
                    LearnerEmail     = l.Email,
                    DayOfWeek        = cs.DayOfWeek,
                    BeginTime        = cs.BeginTime,
                    EndTime          = cs.EndTime,
                }).FirstOrDefaultAsync();
                availableDay = await _ablemusicContext.AvailableDays.Where(ad => ad.TeacherId == inputObj.TeacherId && ad.DayOfWeek == inputObj.DayOfWeek && ad.OrgId == inputObj.OrgId).FirstOrDefaultAsync();
            }
            catch (Exception ex)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = ex.Message;
                return(BadRequest(result));
            }
            if (courseInfo == null)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = "Course schedule or course instance not found";
                return(BadRequest(result));
            }
            if (availableDay == null || availableDay.RoomId == null)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = "Room Id not found";
                return(BadRequest(result));
            }

            try
            {
                newCourseInfo = new
                {
                    newOrg  = await _ablemusicContext.Org.Where(o => o.OrgId == inputObj.OrgId).FirstOrDefaultAsync(),
                    newRoom = await _ablemusicContext.Room.Where(r => r.RoomId == availableDay.RoomId).FirstOrDefaultAsync(),
                };
                learner = await _ablemusicContext.Learner.Where(l => l.LearnerId == inputObj.LearnerId).FirstOrDefaultAsync();

                holidays = await _ablemusicContext.Holiday.ToListAsync();

                exsitingAmendments = await _ablemusicContext.Amendment.Where(a => a.LearnerId == inputObj.LearnerId && a.AmendType == 2 &&
                                                                             a.BeginDate == inputObj.BeginDate && a.EndDate == inputObj.EndDate && inputObj.OrgId == a.OrgId &&
                                                                             inputObj.BeginTime == a.BeginTime && inputObj.DayOfWeek == a.DayOfWeek && inputObj.InstanceId == a.CourseInstanceId &&
                                                                             availableDay.RoomId == a.RoomId && inputObj.IsTemporary == a.IsTemporary
                                                                             ).ToListAsync();
            }
            catch (Exception ex)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = ex.Message;
                return(BadRequest(result));
            }
            if (newCourseInfo == null)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = "Org id or room id not found";
                return(BadRequest(result));
            }
            if (exsitingAmendments.Count > 0)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = "The same change has already being made";
                return(BadRequest(result));
            }
            if (!inputObj.EndDate.HasValue && inputObj.IsTemporary == 1)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = "EndDate is required when type is temporary";
                return(BadRequest(result));
            }

            switch ((short)courseInfo.Duration)
            {
            case 1: inputObj.EndTime = inputObj.BeginTime.Add(TimeSpan.FromMinutes(30));
                break;

            case 2:
                inputObj.EndTime = inputObj.BeginTime.Add(TimeSpan.FromMinutes(45));
                break;

            case 3:
                inputObj.EndTime = inputObj.BeginTime.Add(TimeSpan.FromMinutes(60));
                break;
            }

            foreach (var lesson in exsitingLessons.Reverse <Lesson>())
            {
                if (courseInfo.DayOfWeek != lesson.BeginTime.Value.ToDayOfWeek() || lesson.IsChanged == 1 ||
                    lesson.BeginTime.Value.TimeOfDay != courseInfo.BeginTime)
                {
                    exsitingLessons.Remove(lesson);
                }
            }

            var newLessonsMapOldLesson = new Dictionary <Lesson, Lesson>();

            foreach (var lesson in exsitingLessons)
            {
                DateTime beginTime = lesson.BeginTime.Value;
                DateTime endTime   = lesson.EndTime.Value;
                if (inputObj.DayOfWeek != courseInfo.DayOfWeek)
                {
                    beginTime = beginTime.SetDateByDayOfWeekInWeek(inputObj.DayOfWeek);
                    endTime   = endTime.SetDateByDayOfWeekInWeek(inputObj.DayOfWeek);
                }
                beginTime = beginTime.Date + inputObj.BeginTime;
                endTime   = endTime.Date + inputObj.EndTime;
                newLessonsMapOldLesson.Add(new Lesson
                {
                    LearnerId             = lesson.LearnerId,
                    RoomId                = availableDay.RoomId,
                    TeacherId             = inputObj.TeacherId,
                    OrgId                 = Convert.ToInt16(inputObj.OrgId),
                    IsCanceled            = 0,
                    Reason                = null,
                    CreatedAt             = DateTime.UtcNow.ToNZTimezone(),
                    CourseInstanceId      = lesson.CourseInstanceId,
                    GroupCourseInstanceId = lesson.GroupCourseInstanceId,
                    IsTrial               = lesson.IsTrial,
                    BeginTime             = beginTime,
                    EndTime               = endTime,
                    InvoiceNum            = lesson.InvoiceNum,
                    IsConfirm             = lesson.IsConfirm,
                    TrialCourseId         = lesson.TrialCourseId,
                    IsChanged             = lesson.IsChanged,
                    IsPaid                = lesson.IsPaid,
                    NewLessonId           = lesson.NewLessonId,
                }, lesson);
                lesson.IsCanceled = 1;
            }

            amendment.CourseInstanceId = inputObj.InstanceId;
            amendment.OrgId            = Convert.ToInt16(inputObj.OrgId);
            amendment.DayOfWeek        = inputObj.DayOfWeek;
            amendment.BeginTime        = inputObj.BeginTime;
            amendment.EndTime          = inputObj.EndTime;
            amendment.LearnerId        = inputObj.LearnerId;
            amendment.RoomId           = availableDay.RoomId;
            amendment.BeginDate        = inputObj.BeginDate;
            amendment.EndDate          = inputObj.IsTemporary == 1 ? inputObj.EndDate : null;
            amendment.CreatedAt        = toNZTimezone(DateTime.UtcNow);
            amendment.Reason           = inputObj.Reason;
            amendment.IsTemporary      = inputObj.IsTemporary;
            amendment.AmendType        = 2;
            amendment.TeacherId        = inputObj.TeacherId;
            amendment.CourseScheduleId = inputObj.CourseScheduleId;

            DateTime endDate;

            if (inputObj.IsTemporary == 1)
            {
                endDate = inputObj.EndDate.Value;
            }
            else
            {
                Term     currentTerm        = null;
                Term     nextTerm           = null;
                DateTime lastDateInAllTerms = inputObj.BeginDate;
                foreach (var t in terms)
                {
                    lastDateInAllTerms = lastDateInAllTerms >= t.EndDate.Value ? lastDateInAllTerms : t.EndDate.Value;
                    if (amendment.BeginDate.Value > t.BeginDate.Value && amendment.BeginDate.Value < t.EndDate.Value)
                    {
                        currentTerm = t;
                    }
                }
                if (currentTerm == null)
                {
                    result.IsSuccess    = false;
                    result.ErrorMessage = "Term not found";
                    return(BadRequest(result));
                }
                DateTime currentDay = currentTerm.EndDate.Value.AddDays(1);
                while (currentDay < lastDateInAllTerms)
                {
                    nextTerm = terms.Find(t => t.BeginDate.Value <currentDay && t.EndDate.Value> currentDay);
                    if (nextTerm != null)
                    {
                        break;
                    }
                    else
                    {
                        currentDay = currentDay.AddDays(1);
                    }
                }
                if (nextTerm == null)
                {
                    endDate = currentTerm.EndDate.Value;
                }
                else
                {
                    endDate = nextTerm.EndDate.Value;
                }
            }

            var visualLessonsForCheckingConflict = new List <Lesson>();

            DateTime currentDate      = amendment.BeginDate.Value;
            int      currentDayOfWeek = currentDate.DayOfWeek == 0 ? 7 : (int)currentDate.DayOfWeek;

            while (currentDayOfWeek != amendment.DayOfWeek)
            {
                currentDate      = currentDate.AddDays(1);
                currentDayOfWeek = currentDate.DayOfWeek == 0 ? 7 : (int)currentDate.DayOfWeek;
            }
            while (currentDate <= endDate)
            {
                visualLessonsForCheckingConflict.Add(new Lesson
                {
                    RoomId    = amendment.RoomId,
                    TeacherId = amendment.TeacherId,
                    OrgId     = amendment.OrgId.Value,
                    BeginTime = currentDate.Add(amendment.BeginTime.Value),
                    EndTime   = currentDate.Add(amendment.EndTime.Value),
                });
                currentDate      = currentDate.AddDays(7);
                currentDayOfWeek = currentDate.DayOfWeek == 0 ? 7 : (int)currentDate.DayOfWeek;
            }

            var lessonConflictCheckerService = new LessonConflictCheckerService(_ablemusicContext, inputObj.BeginDate, endDate);

            try
            {
                await lessonConflictCheckerService.LoadAllProtentialConflictLessonsToMemoryAsync();
            }
            catch (Exception ex)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = ex.Message;
                return(BadRequest(result));
            }

            Dictionary <Lesson, object> lessonIdMapConflictCheckResult = new Dictionary <Lesson, object>();

            foreach (var lesson in visualLessonsForCheckingConflict)
            {
                lessonConflictCheckerService.ConfigureLessonToCheck(lesson);
                Result <List <object> > lessonConflictCheckResult = lessonConflictCheckerService.CheckBothRoomAndTeacherInMemory();
                if (!lessonConflictCheckResult.IsSuccess)
                {
                    lessonIdMapConflictCheckResult.Add(lesson, lessonConflictCheckResult);
                }
            }

            if (lessonIdMapConflictCheckResult.Count > 0)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = "Conflict Found";
                result.Data         = new List <object>
                {
                    new { ArrangedLessonFound = exsitingLessons.Count }
                };
                foreach (var conflictResult in lessonIdMapConflictCheckResult)
                {
                    result.Data.Add(new
                    {
                        LessonWithConflict = conflictResult.Key,
                        ConflictDetail     = conflictResult.Value
                    });
                }
                return(BadRequest(result));
            }

            foreach (var holiday in holidays)
            {
                if (holiday.HolidayDate.Date == todoDateBegin.Date)
                {
                    todoDateBegin = todoDateBegin.AddDays(-1);
                }
            }

            if (inputObj.EndDate.HasValue)
            {
                todoDateEnd = inputObj.EndDate.Value;
                foreach (var holiday in holidays)
                {
                    if (holiday.HolidayDate.Date == todoDateEnd.Value.Date)
                    {
                        todoDateEnd = todoDateEnd.Value.AddDays(-1);
                    }
                }
            }

            DateTime remindScheduleDateBegin = todoDateBegin;

            using (var dbContextTransaction = _ablemusicContext.Database.BeginTransaction())
            {
                TodoRepository todoRepository = new TodoRepository(_ablemusicContext);
                todoRepository.AddSingleTodoList("Period Course Change Remind", TodoListContentGenerator.PeriodCourseChangeForLearner(courseInfo,
                                                                                                                                      newCourseInfo, inputObj, todoDateBegin), inputObj.UserId, todoDateBegin, null, inputObj.LearnerId, null);
                todoRepository.AddSingleTodoList("Period Course Change Remind", TodoListContentGenerator.PeriodCourseChangeForTeacher(courseInfo,
                                                                                                                                      newCourseInfo, inputObj, todoDateBegin), inputObj.UserId, todoDateBegin, null, null, courseInfo.TeacherId);
                if (inputObj.EndDate.HasValue && inputObj.IsTemporary == 1)
                {
                    todoRepository.AddSingleTodoList("Period Course Change Remind", TodoListContentGenerator.PeriodCourseChangeForLearner(courseInfo,
                                                                                                                                          newCourseInfo, inputObj, todoDateEnd.Value), inputObj.UserId, todoDateEnd.Value, null, inputObj.LearnerId, null);
                    todoRepository.AddSingleTodoList("Period Course Change Remind", TodoListContentGenerator.PeriodCourseChangeForTeacher(courseInfo,
                                                                                                                                          newCourseInfo, inputObj, todoDateEnd.Value), inputObj.UserId, todoDateEnd.Value, null, null, courseInfo.TeacherId);
                }
                var saveTodoResult = await todoRepository.SaveTodoListsAsync();

                if (!saveTodoResult.IsSuccess)
                {
                    return(BadRequest(saveTodoResult));
                }

                RemindLogRepository remindLogRepository = new RemindLogRepository(_ablemusicContext);
                remindLogRepository.AddSingleRemindLog(courseInfo.LearnerId, courseInfo.LearnerEmail, RemindLogContentGenerator.PeriodCourseChangeForLearner(
                                                           courseInfo, newCourseInfo, inputObj), null, "Period Course Change Remind", null, remindScheduleDateBegin);
                remindLogRepository.AddSingleRemindLog(null, courseInfo.TeacherEmail, RemindLogContentGenerator.PeriodCourseChangeForTeacher(courseInfo,
                                                                                                                                             newCourseInfo, inputObj), courseInfo.TeacherId, "Period Course Change Remind", null, remindScheduleDateBegin);

                var saveRemindLogResult = await remindLogRepository.SaveRemindLogAsync();

                if (!saveRemindLogResult.IsSuccess)
                {
                    return(BadRequest(saveRemindLogResult));
                }

                try
                {
                    foreach (var lesson in newLessonsMapOldLesson)
                    {
                        await _ablemusicContext.Lesson.AddAsync(lesson.Key);
                    }
                    await _ablemusicContext.Amendment.AddAsync(amendment);

                    await _ablemusicContext.SaveChangesAsync();

                    foreach (var lesson in exsitingLessons)
                    {
                        foreach (var m in newLessonsMapOldLesson)
                        {
                            if (m.Value.LessonId == lesson.LessonId)
                            {
                                lesson.NewLessonId = m.Key.LessonId;
                            }
                        }
                    }
                    await _ablemusicContext.SaveChangesAsync();
                }
                catch (Exception ex)
                {
                    result.IsSuccess    = false;
                    result.ErrorMessage = ex.Message;
                    return(BadRequest(result));
                }

                //sending Email
                //List<NotificationEventArgs> notifications = new List<NotificationEventArgs>();
                foreach (var remind in saveRemindLogResult.Data)
                {
                    string currentPersonName;
                    if (remind.TeacherId == null)
                    {
                        currentPersonName = courseInfo.LearnerFirstName + " " + courseInfo.LearnerLastName;
                    }
                    else
                    {
                        currentPersonName = courseInfo.TeacherFirstName + " " + courseInfo.TeacherLastName;
                    }
                    string mailContent = EmailContentGenerator.PeriodCourseChange(currentPersonName, courseInfo, newCourseInfo, inputObj);
                    remindLogRepository.UpdateContent(remind.RemindId, mailContent);
                    //notifications.Add(new NotificationEventArgs(remind.Email, "Period Course Change Remind", mailContent, remind.RemindId));
                }
                var remindLogUpdateContentResult = await remindLogRepository.SaveUpdatedContentAsync();

                if (!remindLogUpdateContentResult.IsSuccess)
                {
                    result.IsSuccess    = false;
                    result.ErrorMessage = remindLogUpdateContentResult.ErrorMessage;
                    return(BadRequest(result));
                }
                //foreach (var mail in notifications)
                //{
                //    _notificationObservable.send(mail);
                //}
                dbContextTransaction.Commit();
            }

            result.Data = new List <object>
            {
                new { ArrangedLessonFound = exsitingLessons.Count },
                new { ArrangedLessonChanged = newLessonsMapOldLesson.Count }
            };

            return(Ok(result));
        }
コード例 #5
0
 public async Task <IActionResult> PostPeriodCourseChange([FromBody] PeriodCourseChangeViewModel inputObj)
 {
     return(await PostPeriodCourseChangeService(inputObj));
 }