Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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));
        }