Пример #1
0
        public async Task <IActionResult> Post([FromBody] TrialLessonViewModel trialLessonViewModel)
        {
            var result         = new Result <Lesson>();
            var lesson         = new Lesson();
            var payment        = new Payment();
            var invoiceWaiting = new InvoiceWaitingConfirm();
            var invoice        = new Invoice();

            lesson.LearnerId             = trialLessonViewModel.LearnerId;
            lesson.RoomId                = trialLessonViewModel.RoomId;
            lesson.TeacherId             = trialLessonViewModel.TeacherId;
            lesson.OrgId                 = trialLessonViewModel.OrgId;
            lesson.IsCanceled            = 0;
            lesson.Reason                = null;
            lesson.CreatedAt             = toNZTimezone(DateTime.UtcNow);
            lesson.CourseInstanceId      = null;
            lesson.GroupCourseInstanceId = null;
            lesson.IsTrial               = 1;
            lesson.BeginTime             = trialLessonViewModel.BeginTime;
            lesson.EndTime               = trialLessonViewModel.EndTime;
            lesson.IsChanged             = 0;
            lesson.IsConfirm             = 0;
            lesson.TrialCourseId         = trialLessonViewModel.TrialCourseId;
            lesson.IsPaid                = trialLessonViewModel.IsPayNow?(short)1: (short)0;

            payment.PaymentMethod = trialLessonViewModel.PaymentMethod;
            payment.LearnerId     = trialLessonViewModel.LearnerId;
            payment.Amount        = trialLessonViewModel.Amount;
            payment.CreatedAt     = toNZTimezone(DateTime.UtcNow);
            payment.StaffId       = trialLessonViewModel.StaffId;
            payment.InvoiceId     = null;
            payment.BeforeBalance = null;
            payment.AfterBalance  = null;
            payment.PaymentType   = 3;
            payment.IsConfirmed   = 0;
            payment.Comment       = null;

            invoiceWaiting.LessonFee   = trialLessonViewModel.Amount;
            invoiceWaiting.LearnerId   = trialLessonViewModel.LearnerId;
            invoiceWaiting.LearnerName = await _ablemusicContext.Learner.
                                         Where(l => l.LearnerId == trialLessonViewModel.LearnerId).Select(l => l.FirstName).FirstOrDefaultAsync();

            invoiceWaiting.BeginDate = trialLessonViewModel.BeginTime.Value.Date;
            invoiceWaiting.EndDate   = trialLessonViewModel.BeginTime.Value.Date;
            invoiceWaiting.TotalFee  = trialLessonViewModel.Amount;
            invoiceWaiting.DueDate   = trialLessonViewModel.BeginTime.Value.Date;
            invoiceWaiting.PaidFee   = 0;
            invoiceWaiting.OwingFee  = trialLessonViewModel.Amount;
            invoiceWaiting.CreatedAt = toNZTimezone(DateTime.UtcNow);
            invoiceWaiting.IsPaid    = 0;
            invoiceWaiting.TermId    = await _ablemusicContext.Term.
                                       Where(t => t.BeginDate <= trialLessonViewModel.BeginTime.Value &&
                                             t.EndDate >= trialLessonViewModel.BeginTime.Value
                                             ).Select(l => l.TermId).FirstOrDefaultAsync();

            invoiceWaiting.LessonQuantity = 1;
            invoiceWaiting.CourseName     = "Trial Lesson";
            invoiceWaiting.IsConfirmed    = 1;
            invoiceWaiting.IsEmailSent    = 0;
            invoiceWaiting.IsActivate     = 1;

            List <Lesson>           conflictRooms          = new List <Lesson>();
            List <Lesson>           conflictTeacherLessons = new List <Lesson>();
            DateTime                beginTime = lesson.BeginTime.Value.AddMinutes(-60);
            DateTime                endTime   = lesson.EndTime.Value.AddMinutes(60);
            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));
            }

            try
            {
                await _ablemusicContext.Lesson.AddAsync(lesson);

                if (trialLessonViewModel.IsPayNow)
                {
                    await _ablemusicContext.Payment.AddAsync(payment);
                }
                else
                {
                    await _ablemusicContext.InvoiceWaitingConfirm.AddAsync(invoiceWaiting);

                    invoiceWaiting.InvoiceNum = invoiceWaiting.WaitingId.ToString();
                    _mapper.Map(invoiceWaiting, invoice);
                    invoice.IsActive = 1;
                    await _ablemusicContext.Invoice.AddAsync(invoice);
                }
                await _ablemusicContext.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                result.IsSuccess    = false;
                result.ErrorMessage = ex.Message;
                return(BadRequest(result));
            }
            result.Data = lesson;
            return(Ok(result));
        }
Пример #2
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));
        }
        public async Task <IActionResult> PutLesson(short userId, [FromBody] LessonViewModel lessonViewmodel)
        {
            var    result = new Result <Lesson>();
            string userConfirmUrlPrefix = _configuration.GetSection("UrlPrefix").Value;
            Lesson newLesson            = new Lesson();
            Lesson oldLesson            = new Lesson();

            _mapper.Map(lessonViewmodel, newLesson);
            try
            {
                oldLesson = await _ablemusicContext.Lesson.Where(l => l.LessonId == newLesson.LessonId).FirstOrDefaultAsync();
            }
            catch (Exception ex)
            {
                result.IsFound      = false;
                result.IsSuccess    = false;
                result.ErrorMessage = ex.ToString();
                return(NotFound(result));
            }
            if (oldLesson == null)
            {
                result.IsFound      = false;
                result.IsSuccess    = false;
                result.ErrorMessage = "Lesson id not found";
                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));
            }

            Learner        learner  = new Learner();
            List <Learner> learners = new List <Learner>();
            Teacher        newTeacher;
            Teacher        oldTeacher;

            pegasusContext.Org oldOrg;
            pegasusContext.Org newOrg;
            Room           oldRoom;
            Room           newRoom;
            Course         course;
            List <Holiday> holidays;

            try
            {
                if (oldLesson.CourseInstanceId != null)
                {
                    learner = await _ablemusicContext.Learner.FirstOrDefaultAsync(l => l.LearnerId == oldLesson.LearnerId);

                    course = await(from c in _ablemusicContext.Course
                                   join oto in _ablemusicContext.One2oneCourseInstance on c.CourseId equals oto.CourseId
                                   join l in _ablemusicContext.Lesson on oto.CourseInstanceId equals l.CourseInstanceId
                                   where l.LessonId == newLesson.LessonId
                                   select new Course
                    {
                        CourseId   = c.CourseId,
                        CourseName = c.CourseName
                    }).FirstOrDefaultAsync();
                }
                else
                {
                    learners = await(from gc in _ablemusicContext.GroupCourseInstance
                                     join lgc in _ablemusicContext.LearnerGroupCourse on gc.GroupCourseInstanceId equals lgc.GroupCourseInstanceId
                                     join l in _ablemusicContext.Learner on lgc.LearnerId equals l.LearnerId
                                     where gc.GroupCourseInstanceId == oldLesson.GroupCourseInstanceId
                                     select l
                                     ).ToListAsync();
                    course = await(from c in _ablemusicContext.Course
                                   join gc in _ablemusicContext.GroupCourseInstance on c.CourseId equals gc.CourseId
                                   join l in _ablemusicContext.Lesson on gc.GroupCourseInstanceId equals l.GroupCourseInstanceId
                                   where l.LessonId == newLesson.LessonId
                                   select new Course
                    {
                        CourseId   = c.CourseId,
                        CourseName = c.CourseName
                    }).FirstOrDefaultAsync();
                }
                newTeacher = await _ablemusicContext.Teacher.FirstOrDefaultAsync(t => t.TeacherId == newLesson.TeacherId);

                oldTeacher = newLesson.TeacherId == oldLesson.TeacherId ? newTeacher :
                             await _ablemusicContext.Teacher.FirstOrDefaultAsync(t => t.TeacherId == oldLesson.TeacherId);

                if (oldLesson.IsTrial == 1)
                {
                    course = await _ablemusicContext.Course.Where(c => c.CourseId == oldLesson.TrialCourseId).FirstOrDefaultAsync();
                }
                holidays = await _ablemusicContext.Holiday.ToListAsync();

                oldOrg = await _ablemusicContext.Org.Where(o => o.OrgId == oldLesson.OrgId).FirstOrDefaultAsync();

                newOrg = newLesson.OrgId == oldLesson.OrgId ? oldOrg :
                         await _ablemusicContext.Org.Where(o => o.OrgId == newLesson.OrgId).FirstOrDefaultAsync();

                oldRoom = await _ablemusicContext.Room.Where(r => r.RoomId == oldLesson.RoomId).FirstOrDefaultAsync();

                newRoom = newLesson.RoomId == oldLesson.RoomId ? oldRoom :
                          await _ablemusicContext.Room.Where(r => r.RoomId == newLesson.RoomId).FirstOrDefaultAsync();
            }
            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 oldTodoDate = oldLesson.BeginTime.Value.AddDays(-1);
            DateTime newTodoDate = newLesson.BeginTime.Value.AddDays(-1);

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

            DateTime oldRemindScheduledDate = oldTodoDate;
            DateTime newRemindScheduledDate = newTodoDate;

            oldLesson.IsCanceled  = 1;
            oldLesson.IsChanged   = 1;
            oldLesson.NewLessonId = 1;
            oldLesson.Reason      = newLesson.Reason;

            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.NewLessonId = oldLesson.NewLessonId;
            newLesson.IsChanged = 0;

            using (var dbContextTransaction = _ablemusicContext.Database.BeginTransaction())
            {
                try
                {
                    await _ablemusicContext.Lesson.AddAsync(newLesson);

                    oldLesson.NewLessonId = newLesson.LessonId;
                    await _ablemusicContext.SaveChangesAsync();
                }
                catch (Exception ex)
                {
                    result.IsSuccess    = false;
                    result.ErrorMessage = ex.ToString();
                    return(BadRequest(result));
                }

                TodoRepository todoRepository = new TodoRepository(_ablemusicContext);
                if (oldLesson.CourseInstanceId != null)
                {
                    todoRepository.AddSingleTodoList("Lesson Rearrangement to Remind", TodoListContentGenerator.RearrangedSingleLessonWithOldLessonForLearner(
                                                         oldLesson, newLesson, learner, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom), userId, newTodoDate, newLesson.LessonId, learner.LearnerId, null);
                    todoRepository.AddSingleTodoList("Lesson Rearrangement to Remind", TodoListContentGenerator.RearrangedSingleLessonWithOldLessonForLearner(
                                                         oldLesson, newLesson, learner, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom), userId, oldTodoDate, oldLesson.LessonId, learner.LearnerId, null);
                }
                else
                {
                    Dictionary <int, string> learnerIdMapContent = new Dictionary <int, string>();
                    foreach (var l in learners)
                    {
                        learnerIdMapContent.Add(l.LearnerId, TodoListContentGenerator.RearrangedSingleLessonWithOldLessonForLearner(oldLesson, newLesson, l, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom));
                    }
                    todoRepository.AddMutipleTodoLists("Lesson Rearrangement to Remind", learnerIdMapContent, userId, newTodoDate, newLesson.LessonId, null);
                    todoRepository.AddMutipleTodoLists("Lesson Rearrangement to Remind", learnerIdMapContent, userId, oldTodoDate, newLesson.LessonId, null);
                }
                todoRepository.AddSingleTodoList("Lesson Rearrangement to Remind", TodoListContentGenerator.RearrangedSingleLessonWithOldLessonForOldTeacher(
                                                     oldLesson, newLesson, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom), userId, newTodoDate, newLesson.LessonId, null, oldTeacher.TeacherId);
                todoRepository.AddSingleTodoList("Lesson Rearrangement to Remind", TodoListContentGenerator.RearrangedSingleLessonWithOldLessonForNewTeacher(
                                                     oldLesson, newLesson, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom), userId, newTodoDate, newLesson.LessonId, null, newTeacher.TeacherId);

                todoRepository.AddSingleTodoList("Lesson Rearrangement to Remind", TodoListContentGenerator.RearrangedSingleLessonWithOldLessonForOldTeacher(
                                                     oldLesson, newLesson, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom), userId, oldTodoDate, oldLesson.LessonId, null, oldTeacher.TeacherId);
                todoRepository.AddSingleTodoList("Lesson Rearrangement to Remind", TodoListContentGenerator.RearrangedSingleLessonWithOldLessonForNewTeacher(
                                                     oldLesson, newLesson, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom), userId, oldTodoDate, oldLesson.LessonId, null, newTeacher.TeacherId);
                var saveTodoResult = await todoRepository.SaveTodoListsAsync();

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

                RemindLogRepository remindLogRepository       = new RemindLogRepository(_ablemusicContext);
                DateTime            earlyDate                 = newRemindScheduledDate >= oldRemindScheduledDate ? oldRemindScheduledDate : newRemindScheduledDate;
                DateTime            laterDate                 = newRemindScheduledDate >= oldRemindScheduledDate ? newRemindScheduledDate : oldRemindScheduledDate;
                DateTime            laterDateNoticeWeekBefore = laterDate.AddDays(-7);
                int dateDifferentBetweenNowAndEarlyDate       = (int)(earlyDate - DateTime.UtcNow.ToNZTimezone()).TotalDays;
                int dateDifferentBetweenEarlyDateAndLaterDate = (int)(laterDate - earlyDate).TotalDays;
                if (dateDifferentBetweenNowAndEarlyDate < 7 & dateDifferentBetweenNowAndEarlyDate > 1)
                {
                    earlyDate = DateTime.UtcNow.ToNZTimezone().AddDays(1);
                }
                List <DateTime> remindScheduledDates = new List <DateTime>
                {
                    earlyDate,
                    laterDate
                };
                foreach (var remindScheduleDate in remindScheduledDates)
                {
                    if (oldLesson.CourseInstanceId != null)
                    {
                        remindLogRepository.AddSingleRemindLog(learner.LearnerId, learner.Email, RemindLogContentGenerator.RearrangedSingleLessonWithOldLessonForLearner(
                                                                   oldLesson, newLesson, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom, courseName), null, "Lesson Rearrangement Remind", newLesson.LessonId, remindScheduleDate);
                    }
                    else
                    {
                        Dictionary <Learner, string> learnerMapContent = new Dictionary <Learner, string>();
                        foreach (var l in learners)
                        {
                            learnerMapContent.Add(l, RemindLogContentGenerator.RearrangedSingleLessonWithOldLessonForLearner(oldLesson, newLesson, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom, courseName));
                        }
                        remindLogRepository.AddMultipleRemindLogs(learnerMapContent, null, "Lesson rearrangement Remind", newLesson.LessonId, remindScheduleDate);
                    }
                    remindLogRepository.AddSingleRemindLog(null, oldTeacher.Email, RemindLogContentGenerator.RearrangedSingleLessonWithOldLessonForOldTeacher(
                                                               oldLesson, newLesson, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom, courseName), oldTeacher.TeacherId, "Lesson Rearrangement Remind", oldLesson.LessonId, remindScheduleDate);
                    remindLogRepository.AddSingleRemindLog(null, newTeacher.Email, RemindLogContentGenerator.RearrangedSingleLessonWithOldLessonForNewTeacher(
                                                               oldLesson, newLesson, oldTeacher, newTeacher, oldOrg, newOrg, oldRoom, newRoom, courseName), newTeacher.TeacherId, "Lesson Rearrangement Remind", newLesson.LessonId, remindScheduleDate);
                }

                foreach (var remindlog in remindLogRepository._remindLogs.Reverse <RemindLog>())
                {
                    if (remindlog.ScheduledDate <= DateTime.UtcNow.ToNZTimezone())
                    {
                        remindLogRepository._remindLogs.Remove(remindlog);
                    }
                    if (dateDifferentBetweenEarlyDateAndLaterDate <= 7)
                    {
                        if (remindlog.ScheduledDate.Value.Date == laterDateNoticeWeekBefore.Date)
                        {
                            remindLogRepository._remindLogs.Remove(remindlog);
                        }
                    }
                }

                var saveRemindLogResult = await remindLogRepository.SaveRemindLogAsync();

                if (!saveRemindLogResult.IsSuccess)
                {
                    try
                    {
                        oldLesson.IsCanceled = 0;
                        oldLesson.Reason     = "";
                        _ablemusicContext.Lesson.Remove(newLesson);
                        await _ablemusicContext.SaveChangesAsync();
                    }
                    catch (Exception ex)
                    {
                        result.IsSuccess    = false;
                        result.ErrorMessage = ex.Message + "\n" + saveTodoResult.ErrorMessage;
                        return(BadRequest(result));
                    }
                    return(BadRequest(saveRemindLogResult));
                }

                //sending Email
                //List<NotificationEventArgs> notifications = new List<NotificationEventArgs>();
                foreach (var remind in saveRemindLogResult.Data)
                {
                    var    todo = saveTodoResult.Data.Find(t => t.LearnerId == remind.LearnerId && t.TeacherId == remind.TeacherId && t.TodoDate == newTodoDate);
                    string currentPersonName;
                    if (remind.TeacherId == null)
                    {
                        currentPersonName = learner.FirstName + " " + learner.LastName;
                    }
                    else
                    {
                        currentPersonName = remind.TeacherId == newTeacher.TeacherId ? newTeacher.FirstName + " " + newTeacher.LastName : oldTeacher.FirstName + " " + oldTeacher.LastName;
                    }
                    string confirmURL  = userConfirmUrlPrefix + todo.ListId + "/" + remind.RemindId;
                    string mailContent = EmailContentGenerator.RearrangeLessonWithOld(currentPersonName, courseName, confirmURL, oldLesson, oldTeacher,
                                                                                      newTeacher, oldOrg, newOrg, oldRoom, newRoom);
                    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));
                }
                //foreach (var mail in notifications)
                //{
                //    _notificationObservable.send(mail);
                //}
                dbContextTransaction.Commit();
            }

            result.IsSuccess = true;
            //result.Data = newLesson;
            return(Ok(result));
        }
        public async Task <IActionResult> RegistTrial([FromBody] TrialLessonAndLearnerModel trialLessonViewModel)
        {
            var result         = new Result <Lesson>();
            var lesson         = new Lesson();
            var payment        = new Payment();
            var learner        = new Learner();
            var invoiceWaiting = new InvoiceWaitingConfirm();
            var invoice        = new Invoice();

            using (var dbContextTransaction = _ablemusicContext.Database.BeginTransaction())
            {
                learner.FirstName  = trialLessonViewModel.FirstName;
                learner.LastName   = trialLessonViewModel.LastName;
                learner.ContactNum = trialLessonViewModel.ContactNum;
                learner.Email      = trialLessonViewModel.Email;
                learner.EnrollDate = toNZTimezone(DateTime.UtcNow);
                learner.OrgId      = trialLessonViewModel.OrgId;
                learner.CreatedAt  = toNZTimezone(DateTime.UtcNow);
                learner.IsActive   = 1;
                //learner.LearnerLevel = 0;
                learner.PaymentPeriod = 1;
                // learner.LevelType = 1;
                _ablemusicContext.Add(learner);
                await _ablemusicContext.SaveChangesAsync();

                // var fundItem = new Fund { Balance = 0, LearnerId = newLearner.LearnerId };
                _ablemusicContext.Add(new Fund {
                    Balance = 0, LearnerId = learner.LearnerId
                });
                await _ablemusicContext.SaveChangesAsync();

                _ablemusicContext.Add(new User
                {
                    UserName   = "******" + learner.LearnerId.ToString(),
                    Password   = "******",
                    CreatedAt  = toNZTimezone(DateTime.UtcNow),
                    RoleId     = 4,
                    IsActivate = 1
                });
                await _ablemusicContext.SaveChangesAsync();

                lesson.LearnerId             = learner.LearnerId;
                lesson.RoomId                = trialLessonViewModel.RoomId;
                lesson.TeacherId             = trialLessonViewModel.TeacherId;
                lesson.OrgId                 = trialLessonViewModel.OrgId;
                lesson.IsCanceled            = 0;
                lesson.Reason                = null;
                lesson.CreatedAt             = toNZTimezone(DateTime.UtcNow);
                lesson.CourseInstanceId      = null;
                lesson.GroupCourseInstanceId = null;
                lesson.IsTrial               = 1;
                lesson.BeginTime             = trialLessonViewModel.BeginTime;
                lesson.EndTime               = trialLessonViewModel.EndTime;
                lesson.IsChanged             = 2;
                lesson.IsConfirm             = 0;
                lesson.TrialCourseId         = trialLessonViewModel.TrialCourseId;
                lesson.IsPaid                = trialLessonViewModel.IsPayNow ? (short)1 : (short)0;

                payment.PaymentMethod = trialLessonViewModel.PaymentMethod;
                payment.LearnerId     = learner.LearnerId;
                payment.Amount        = trialLessonViewModel.Amount;
                payment.CreatedAt     = toNZTimezone(DateTime.UtcNow);
                payment.StaffId       = trialLessonViewModel.StaffId;
                payment.InvoiceId     = null;
                payment.BeforeBalance = null;
                payment.AfterBalance  = null;
                payment.PaymentType   = 3;
                payment.IsConfirmed   = 0;
                payment.Comment       = null;

                invoiceWaiting.LessonFee   = trialLessonViewModel.Amount;
                invoiceWaiting.LearnerId   = learner.LearnerId;
                invoiceWaiting.LearnerName = await _ablemusicContext.Learner.
                                             Where(l => l.LearnerId == learner.LearnerId).Select(l => l.FirstName).FirstOrDefaultAsync();

                invoiceWaiting.BeginDate = trialLessonViewModel.BeginTime.Value.Date;
                invoiceWaiting.EndDate   = trialLessonViewModel.BeginTime.Value.Date;
                invoiceWaiting.TotalFee  = trialLessonViewModel.Amount;
                invoiceWaiting.DueDate   = trialLessonViewModel.BeginTime.Value.Date.AddDays(7);
                invoiceWaiting.PaidFee   = 0;
                invoiceWaiting.OwingFee  = trialLessonViewModel.Amount;
                invoiceWaiting.CreatedAt = toNZTimezone(DateTime.UtcNow);
                invoiceWaiting.IsPaid    = 0;
                invoiceWaiting.TermId    = await _ablemusicContext.Term.
                                           Where(t => t.BeginDate <= trialLessonViewModel.BeginTime.Value &&
                                                 t.EndDate >= trialLessonViewModel.BeginTime.Value
                                                 ).Select(l => l.TermId).FirstOrDefaultAsync();

                invoiceWaiting.LessonQuantity = 1;
                invoiceWaiting.CourseName     = "Trial Lesson";
                invoiceWaiting.IsConfirmed    = 1;
                invoiceWaiting.IsEmailSent    = 0;
                invoiceWaiting.IsActivate     = 1;

                List <Lesson>           conflictRooms          = new List <Lesson>();
                List <Lesson>           conflictTeacherLessons = new List <Lesson>();
                DateTime                beginTime = lesson.BeginTime.Value.AddMinutes(-60);
                DateTime                endTime   = lesson.EndTime.Value.AddMinutes(60);
                var                     lessonConflictCheckerService = new LessonConflictCheckerService(_ablemusicContext, lesson);
                Result <List <object> > lessonConflictCheckResult;
                try
                {
                    lessonConflictCheckResult = await lessonConflictCheckerService.CheckBothRoomAndTeacher();
                }
                catch (Exception ex)
                {
                    dbContextTransaction.Rollback();
                    result.IsSuccess    = false;
                    result.ErrorMessage = ex.Message;
                    return(BadRequest(result));
                }
                if (!lessonConflictCheckResult.IsSuccess)
                {
                    return(BadRequest(lessonConflictCheckResult));
                }

                try
                {
                    if (trialLessonViewModel.IsPayNow)
                    {
                        await _ablemusicContext.Payment.AddAsync(payment);
                    }
                    else
                    {
                        await _ablemusicContext.InvoiceWaitingConfirm.AddAsync(invoiceWaiting);

                        await _ablemusicContext.SaveChangesAsync();

                        invoiceWaiting.InvoiceNum = invoiceWaiting.WaitingId.ToString();
                        _mapper.Map(invoiceWaiting, invoice);
                        invoice.IsActive = 1;
                        await _ablemusicContext.Invoice.AddAsync(invoice);
                    }
                    lesson.InvoiceNum = invoiceWaiting.InvoiceNum;
                    await _ablemusicContext.Lesson.AddAsync(lesson);

                    await _ablemusicContext.SaveChangesAsync();

                    dbContextTransaction.Commit();
                }
                catch (Exception ex)
                {
                    dbContextTransaction.Rollback();
                    result.IsSuccess    = false;
                    result.ErrorMessage = ex.Message;
                    return(BadRequest(result));
                }
                result.Data = lesson;
                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));
        }