public async Task <IActionResult> Post(int userId, [FromBody] LessonViewModel lessonViewModel) { var result = new Result <Lesson>(); var lesson = _mapper.Map(lessonViewModel, new Lesson()); var lessonRemains = new List <LessonRemain>(); var course = new Course(); var awaitMakeUpLessons = new List <AwaitMakeUpLesson>(); string userConfirmUrlPrefix = _configuration.GetSection("UrlPrefix").Value; try { lessonRemains = await _ablemusicContext.LessonRemain.Where(lr => lr.CourseInstanceId == lesson.CourseInstanceId && lr.LearnerId == lesson.LearnerId).ToListAsync(); course = await(from oto in _ablemusicContext.One2oneCourseInstance join c in _ablemusicContext.Course on oto.CourseId equals c.CourseId where oto.CourseInstanceId == lesson.CourseInstanceId select new Course { CourseId = c.CourseId, CourseName = c.CourseName, Duration = c.Duration, }).FirstOrDefaultAsync(); awaitMakeUpLessons = await _ablemusicContext.AwaitMakeUpLesson.Where(a => a.IsActive == 1 && a.LearnerId == lesson.LearnerId && (a.CourseInstanceId.HasValue && lesson.CourseInstanceId == a.CourseInstanceId) || (a.GroupCourseInstanceId.HasValue && lesson.GroupCourseInstanceId == a.GroupCourseInstanceId)) .OrderBy(a => a.ExpiredDate).ToListAsync(); } catch (Exception ex) { LogErrorToFile(ex.Message); result.IsSuccess = false; result.ErrorMessage = ex.Message; return(BadRequest(result)); } if (lessonRemains.Count <= 0) { result.IsSuccess = false; result.ErrorMessage = "Lesson Remain not found"; return(BadRequest(result)); } if (course == null) { result.IsSuccess = false; result.ErrorMessage = "Course not found"; return(BadRequest(result)); } if (awaitMakeUpLessons.Count <= 0) { result.IsSuccess = false; result.ErrorMessage = "AwaitMakeUpLesson not found"; return(BadRequest(result)); } AwaitMakeUpLesson validMakeUpLesson = null; foreach (var makeUpLesson in awaitMakeUpLessons) { if (makeUpLesson.ExpiredDate.Value.Date >= lesson.BeginTime.Value.Date) { validMakeUpLesson = makeUpLesson; break; } } if (validMakeUpLesson == null) { result.IsSuccess = false; result.ErrorMessage = "Your lesson all expired"; return(BadRequest(result)); } TimeSpan duration; switch (course.Duration) { case 1: duration = TimeSpan.FromMinutes(30); break; case 2: duration = TimeSpan.FromMinutes(45); break; case 3: duration = TimeSpan.FromMinutes(60); break; default: duration = TimeSpan.FromMinutes(0); break; } lesson.EndTime = lesson.BeginTime.Value.Add(duration); int termId = 0; foreach (var lr in lessonRemains) { if (lr.Quantity > 0) { termId = (int)lr.TermId; } } if (termId == 0) { result.IsSuccess = false; result.ErrorMessage = "Lesson Remain not found"; return(BadRequest(result)); } Teacher teacher = new Teacher(); var invoice = new Invoice(); var holidays = new List <Holiday>(); var org = new pegasusContext.Org(); var room = new Room(); var learner = new Learner(); try { invoice = await _ablemusicContext.Invoice.Where(i => i.TermId == termId && i.LearnerId == lesson.LearnerId && i.CourseInstanceId == lesson.CourseInstanceId).FirstOrDefaultAsync(); teacher = await _ablemusicContext.Teacher.Where(t => t.TeacherId == lesson.TeacherId).FirstOrDefaultAsync(); org = await _ablemusicContext.Org.Where(o => o.OrgId == lesson.OrgId).FirstOrDefaultAsync(); room = await _ablemusicContext.Room.Where(r => r.RoomId == lesson.RoomId).FirstOrDefaultAsync(); learner = await _ablemusicContext.Learner.Where(l => l.LearnerId == lesson.LearnerId).FirstOrDefaultAsync(); holidays = await _ablemusicContext.Holiday.ToListAsync(); } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.Message; return(BadRequest(result)); } if (learner == null) { result.IsSuccess = false; result.ErrorMessage = "Learner not found"; return(BadRequest(result)); } if (room == null) { result.IsSuccess = false; result.ErrorMessage = "Room not found"; return(BadRequest(result)); } if (org == null) { result.IsSuccess = false; result.ErrorMessage = "Org not found"; return(BadRequest(result)); } if (teacher == null) { result.IsSuccess = false; result.ErrorMessage = "Teacher not found"; return(BadRequest(result)); } if (invoice == null) { result.IsSuccess = false; result.ErrorMessage = "Lesson Remain not found"; return(BadRequest(result)); } var lessonConflictCheckerService = new LessonConflictCheckerService(_ablemusicContext, lesson); Result <List <object> > lessonConflictCheckResult; try { lessonConflictCheckResult = await lessonConflictCheckerService.CheckBothRoomAndTeacher(); } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.Message; return(BadRequest(result)); } if (!lessonConflictCheckResult.IsSuccess) { return(BadRequest(lessonConflictCheckResult)); } DateTime todoDate = lesson.BeginTime.Value.AddDays(-1); foreach (var holiday in holidays) { if (holiday.HolidayDate.Date == todoDate.Date) { todoDate = todoDate.AddDays(-1); } } DateTime remindScheduleDate = todoDate; lesson.LessonId = 0; lesson.IsCanceled = 0; lesson.Reason = null; lesson.CreatedAt = toNZTimezone(DateTime.UtcNow); lesson.GroupCourseInstanceId = null; lesson.IsTrial = 0; lesson.InvoiceNum = invoice.InvoiceNum; lesson.IsConfirm = 0; lesson.IsPaid = 1; lesson.TrialCourseId = null; lesson.IsChanged = 0; validMakeUpLesson.IsActive = 0; using (var dbContextTransaction = _ablemusicContext.Database.BeginTransaction()) { try { await _ablemusicContext.Lesson.AddAsync(lesson); await _ablemusicContext.SaveChangesAsync(); validMakeUpLesson.NewLessonId = lesson.LessonId; await _ablemusicContext.SaveChangesAsync(); } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.Message; return(BadRequest(result)); } TodoRepository todoRepository = new TodoRepository(_ablemusicContext); todoRepository.AddSingleTodoList("Lesson Rearranged", TodoListContentGenerator.RearrangedSingleLessonWithoutOldLessonForLearner( learner, lesson, org, room, teacher), (short)userId, todoDate, lesson.LessonId, lesson.LearnerId, null); todoRepository.AddSingleTodoList("Lesson Rearranged", TodoListContentGenerator.RearrangedSingleLessonWithoutOldLessonForTeacher( learner, lesson, org, room, teacher), (short)userId, todoDate, lesson.LessonId, null, teacher.TeacherId); var saveTodoResult = await todoRepository.SaveTodoListsAsync(); if (!saveTodoResult.IsSuccess) { try { _ablemusicContext.Lesson.Remove(lesson); } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.Message + "\n" + saveTodoResult.ErrorMessage; return(BadRequest(result)); } return(BadRequest(saveTodoResult)); } RemindLogRepository remindLogRepository = new RemindLogRepository(_ablemusicContext); remindLogRepository.AddSingleRemindLog(learner.LearnerId, learner.Email, RemindLogContentGenerator.RearrangedSingleLessonWithoutOldLessonForLearner( learner, lesson, org, room, teacher), null, "Lesson Rearranged", lesson.LessonId, remindScheduleDate); remindLogRepository.AddSingleRemindLog(null, teacher.Email, RemindLogContentGenerator.RearrangedSingleLessonWithoutOldLessonForTeacher( learner, lesson, org, room, teacher), teacher.TeacherId, "Lesson Rearranged", lesson.LessonId, remindScheduleDate); var saveRemindResult = await remindLogRepository.SaveRemindLogAsync(); if (!saveRemindResult.IsSuccess) { try { _ablemusicContext.Lesson.Remove(lesson); } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.Message + "\n" + saveRemindResult.ErrorMessage; return(BadRequest(result)); } return(BadRequest(saveRemindResult)); } //sending Email //List<NotificationEventArgs> notifications = new List<NotificationEventArgs>(); foreach (var todo in saveTodoResult.Data) { var remind = saveRemindResult.Data.Find(r => r.LearnerId == todo.LearnerId && r.TeacherId == todo.TeacherId); string currentPersonName; if (todo.TeacherId == null) { currentPersonName = learner.FirstName + " " + learner.LastName; } else { currentPersonName = teacher.FirstName + " " + teacher.LastName; } string confirmURL = userConfirmUrlPrefix + todo.ListId + "/" + remind.RemindId; string mailContent = EmailContentGenerator.RearrangeLesson(currentPersonName, course.CourseName, lesson, confirmURL, org, room); remindLogRepository.UpdateContent(remind.RemindId, mailContent); //notifications.Add(new NotificationEventArgs(remind.Email, "Lesson Rearrange Confirm", mailContent, remind.RemindId)); } var remindLogUpdateContentResult = await remindLogRepository.SaveUpdatedContentAsync(); if (!remindLogUpdateContentResult.IsSuccess) { result.IsSuccess = false; result.ErrorMessage = remindLogUpdateContentResult.ErrorMessage; return(BadRequest(result)); } dbContextTransaction.Commit(); //foreach (var mail in notifications) //{ // _notificationObservable.send(mail); //} } result.Data = lesson; result.Data.Learner = null; result.Data.Org = null; result.Data.Room = null; result.Data.Teacher = null; return(Ok(result)); }
public async Task <IActionResult> PutSesson(int sessionId, string reason, short userId) { var result = new Result <string>(); var awaitMakeUpLesson = new AwaitMakeUpLesson(); Lesson lesson; try { lesson = await _ablemusicContext.Lesson.Where(x => x.LessonId == sessionId).FirstOrDefaultAsync(); } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.ToString(); return(NotFound(result)); } if (lesson == null) { result.IsSuccess = false; result.ErrorMessage = "Session not found"; return(NotFound(result)); } if (lesson.IsCanceled == 1) { result.IsSuccess = false; result.ErrorMessage = "This lesson has already been cancelled"; return(BadRequest(result)); } if (string.IsNullOrEmpty(reason)) { result.IsSuccess = false; result.ErrorMessage = "Reason is required"; return(NotFound(result)); } var user = await _ablemusicContext.User.Where(u => u.UserId == userId).FirstOrDefaultAsync(); if (user == null) { result.IsSuccess = false; result.ErrorMessage = "User id not found"; return(NotFound(result)); } lesson.IsCanceled = 1; lesson.Reason = reason; //save to making up lessones to save awaitMakeUpLesson.MissedLessonId = lesson.LessonId; awaitMakeUpLesson.LearnerId = lesson.LearnerId; awaitMakeUpLesson.CourseInstanceId = lesson.CourseInstanceId; awaitMakeUpLesson.GroupCourseInstanceId = lesson.GroupCourseInstanceId; awaitMakeUpLesson.CreateAt = toNZTimezone(DateTime.UtcNow); awaitMakeUpLesson.IsActive = 1; awaitMakeUpLesson.ExpiredDate = lesson.BeginTime.Value.Date.AddMonths(3); await _ablemusicContext.AwaitMakeUpLesson.AddAsync(awaitMakeUpLesson); bool isGroupCourse = lesson.LearnerId == null; Teacher teacher; Course course; List <Holiday> holidays; try { teacher = await _ablemusicContext.Teacher.FirstOrDefaultAsync(t => t.TeacherId == lesson.TeacherId); if (lesson.IsTrial == 1) { course = await _ablemusicContext.Course.Where(c => c.CourseId == lesson.TrialCourseId).FirstOrDefaultAsync(); } else { course = isGroupCourse ? await(from c in _ablemusicContext.Course join gc in _ablemusicContext.GroupCourseInstance on c.CourseId equals gc.CourseId where gc.GroupCourseInstanceId == lesson.GroupCourseInstanceId select new Course { CourseId = c.CourseId, CourseName = c.CourseName }).FirstOrDefaultAsync() : await(from c in _ablemusicContext.Course join oto in _ablemusicContext.One2oneCourseInstance on c.CourseId equals oto.CourseId where oto.CourseInstanceId == lesson.CourseInstanceId select new Course { CourseId = c.CourseId, CourseName = c.CourseName }).FirstOrDefaultAsync(); } holidays = await _ablemusicContext.Holiday.ToListAsync(); } catch (Exception e) { result.IsSuccess = false; result.ErrorMessage = e.Message; return(NotFound(result)); } if (course == null) { result.IsSuccess = false; result.ErrorMessage = "Fail to found course name under this lesson"; return(NotFound(result)); } string courseName = course.CourseName; DateTime todoDate = lesson.BeginTime.Value.AddDays(-1); foreach (var holiday in holidays) { if (holiday.HolidayDate.Date == todoDate.Date) { todoDate = todoDate.AddDays(-1); } } DateTime remindScheduleDate = todoDate; //string userConfirmUrlPrefix = "https://localhost:44304/api/session/sessioncancelconfirm/"; string userConfirmUrlPrefix = _configuration.GetSection("UrlPrefix").Value; using (var dbContextTransaction = _ablemusicContext.Database.BeginTransaction()) { if (!isGroupCourse) // Case of one to one course { Learner learner; try { learner = await _ablemusicContext.Learner.FirstOrDefaultAsync(l => l.LearnerId == lesson.LearnerId); } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.ToString(); return(NotFound(result)); } TodoRepository todoRepository = new TodoRepository(_ablemusicContext); todoRepository.AddSingleTodoList("Cancellation to Remind", TodoListContentGenerator.CancelSingleLessonForTeacher(teacher, lesson, reason), userId, todoDate, lesson.LessonId, null, teacher.TeacherId); todoRepository.AddSingleTodoList("Cancellation to Remind", TodoListContentGenerator.CancelSingleLessonForLearner(learner, lesson, reason), userId, todoDate, lesson.LessonId, learner.LearnerId, null); var saveTodoResult = await todoRepository.SaveTodoListsAsync(); if (!saveTodoResult.IsSuccess) { return(BadRequest(saveTodoResult)); } RemindLogRepository remindLogRepository = new RemindLogRepository(_ablemusicContext); remindLogRepository.AddSingleRemindLog(null, teacher.Email, RemindLogContentGenerator.CancelSingleLessonForTeacher(courseName, lesson, reason), teacher.TeacherId, "Lesson Cancellation Remind", lesson.LessonId, remindScheduleDate); remindLogRepository.AddSingleRemindLog(learner.LearnerId, learner.Email, RemindLogContentGenerator.CancelSingleLessonForLearner(courseName, lesson, reason), null, "Lesson Cancellation Remind", lesson.LessonId, remindScheduleDate); var saveRemindLogResult = await remindLogRepository.SaveRemindLogAsync(); if (!saveRemindLogResult.IsSuccess) { return(BadRequest(saveRemindLogResult)); } try { await _ablemusicContext.SaveChangesAsync(); } catch (Exception e) { result.ErrorMessage = e.Message; result.IsSuccess = false; return(BadRequest(result)); } //sending Email //List<NotificationEventArgs> notifications = new List<NotificationEventArgs>(); foreach (var todo in saveTodoResult.Data) { var remind = saveRemindLogResult.Data.Find(r => r.LearnerId == todo.LearnerId && r.TeacherId == todo.TeacherId); string currentPersonName; if (todo.TeacherId == null) { currentPersonName = learner.FirstName + " " + learner.LastName; } else { currentPersonName = teacher.FirstName + " " + teacher.LastName; } string confirmURL = userConfirmUrlPrefix + todo.ListId + "/" + remind.RemindId; string mailContent = EmailContentGenerator.CancelLesson(currentPersonName, courseName, lesson, reason, confirmURL); remindLogRepository.UpdateContent(remind.RemindId, mailContent); //notifications.Add(new NotificationEventArgs(remind.Email, "Lesson Cancellation Confirm", 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); //} } else //Case of group course { List <Learner> learners; try { learners = (from lgc in _ablemusicContext.LearnerGroupCourse join l in _ablemusicContext.Learner on lgc.LearnerId equals l.LearnerId where lgc.GroupCourseInstanceId == lesson.GroupCourseInstanceId select new Learner() { LearnerId = l.LearnerId, FirstName = l.FirstName, LastName = l.LastName, Email = l.Email }).ToList(); } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.ToString(); return(NotFound(result)); } var todoForLearnersIdMapContent = new Dictionary <int, string>(); var remindLogForLearnersMapContent = new Dictionary <Learner, string>(); foreach (var l in learners) { todoForLearnersIdMapContent.Add(l.LearnerId, TodoListContentGenerator.CancelSingleLessonForLearner(l, lesson, reason)); remindLogForLearnersMapContent.Add(l, RemindLogContentGenerator.CancelSingleLessonForLearner(courseName, lesson, reason)); } TodoRepository todoRepository = new TodoRepository(_ablemusicContext); todoRepository.AddSingleTodoList("Cancellation to Remind", TodoListContentGenerator.CancelSingleLessonForTeacher(teacher, lesson, reason), userId, todoDate, lesson.LessonId, null, teacher.TeacherId); todoRepository.AddMutipleTodoLists("Cancellation to Remind", todoForLearnersIdMapContent, userId, todoDate, lesson.LessonId, null); var saveTodoListsResult = await todoRepository.SaveTodoListsAsync(); if (!saveTodoListsResult.IsSuccess) { return(BadRequest(saveTodoListsResult)); } RemindLogRepository remindLogRepository = new RemindLogRepository(_ablemusicContext); remindLogRepository.AddSingleRemindLog(null, teacher.Email, RemindLogContentGenerator.CancelSingleLessonForTeacher(courseName, lesson, reason), teacher.TeacherId, "Lesson Cancellation Remind", lesson.LessonId, remindScheduleDate); remindLogRepository.AddMultipleRemindLogs(remindLogForLearnersMapContent, null, "Lesson Cancellation Remind", lesson.LessonId, remindScheduleDate); var saveRemindLogResult = await remindLogRepository.SaveRemindLogAsync(); if (!saveRemindLogResult.IsSuccess) { return(BadRequest(saveRemindLogResult)); } try { await _ablemusicContext.SaveChangesAsync(); } catch (Exception e) { result.ErrorMessage = e.Message; result.IsSuccess = false; return(BadRequest(result)); } //sending Email //List<NotificationEventArgs> notifications = new List<NotificationEventArgs>(); foreach (var todo in saveTodoListsResult.Data) { var remind = saveRemindLogResult.Data.Find(r => r.LearnerId == todo.LearnerId && r.TeacherId == todo.TeacherId); string currentPersonName; if (todo.TeacherId == null) { currentPersonName = learners.Find(l => l.LearnerId == todo.LearnerId).FirstName + " " + learners.Find(l => l.LearnerId == todo.LearnerId).LastName; } else { currentPersonName = teacher.FirstName + " " + teacher.LastName; } string confirmURL = userConfirmUrlPrefix + todo.ListId + "/" + remind.RemindId; string mailContent = EmailContentGenerator.CancelLesson(currentPersonName, courseName, lesson, reason, confirmURL); remindLogRepository.UpdateContent(remind.RemindId, mailContent); //notifications.Add(new NotificationEventArgs(remind.Email, "Lesson Cancellation Confirm", 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(); } return(Ok(result)); }
//补一节课 public async Task <IActionResult> PutGroupMakeupLesson(short userId, [FromBody] GroupMakeupLessonViewModel lessonViewmodel) { var result = new Result <Lesson>(); var awaitMakeUpLesson = new AwaitMakeUpLesson(); Lesson newLesson = new Lesson(); Lesson oldLesson = new Lesson(); _mapper.Map(lessonViewmodel, newLesson); try { awaitMakeUpLesson = await _ablemusicContext.AwaitMakeUpLesson.Where(l => l.AwaitId == lessonViewmodel.AwaitId).FirstOrDefaultAsync(); if (awaitMakeUpLesson == null) { throw new Exception("Missed Lesson id not found"); } oldLesson = await _ablemusicContext.Lesson.Where(l => l.LessonId == awaitMakeUpLesson.MissedLessonId).FirstOrDefaultAsync(); if (oldLesson == null) { throw new Exception("Old Lesson not found"); } } catch (Exception ex) { result.IsFound = false; result.IsSuccess = false; result.ErrorMessage = ex.ToString(); return(NotFound(result)); } TimeSpan lessonDuration = oldLesson.EndTime.Value.Subtract(oldLesson.BeginTime.Value); newLesson.EndTime = newLesson.BeginTime.Value.Add(lessonDuration); var lessonConflictCheckerService = new LessonConflictCheckerService(_ablemusicContext, newLesson.BeginTime.Value, newLesson.EndTime.Value, newLesson.RoomId.Value, newLesson.OrgId, (int)newLesson.TeacherId, oldLesson.LessonId); Result <List <object> > lessonConflictCheckResult; try { lessonConflictCheckResult = await lessonConflictCheckerService.CheckBothRoomAndTeacher(); } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.Message; return(BadRequest(result)); } if (!lessonConflictCheckResult.IsSuccess) { return(BadRequest(lessonConflictCheckResult)); } newLesson.LessonId = 0; newLesson.LearnerId = oldLesson.LearnerId; newLesson.IsCanceled = 0; newLesson.Reason = ""; newLesson.CreatedAt = toNZTimezone(DateTime.UtcNow); newLesson.CourseInstanceId = oldLesson.CourseInstanceId; newLesson.GroupCourseInstanceId = oldLesson.GroupCourseInstanceId; newLesson.IsTrial = oldLesson.IsTrial; newLesson.TrialCourseId = oldLesson.TrialCourseId; newLesson.InvoiceNum = oldLesson.InvoiceNum; newLesson.IsPaid = oldLesson.IsPaid; newLesson.IsConfirm = oldLesson.IsConfirm; //newLesson.NewLessonId = oldLesson.NewLessonId; newLesson.IsChanged = 2; using (var dbContextTransaction = _ablemusicContext.Database.BeginTransaction()) { try { await _ablemusicContext.Lesson.AddAsync(newLesson); await _ablemusicContext.SaveChangesAsync(); awaitMakeUpLesson.NewLessonId = newLesson.LessonId; awaitMakeUpLesson.IsActive = 0; _ablemusicContext.Update(awaitMakeUpLesson); await _ablemusicContext.SaveChangesAsync(); } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.ToString(); return(BadRequest(result)); } dbContextTransaction.Commit(); } result.IsSuccess = true; //result.Data = newLesson; return(Ok(result)); }