public async Task <IActionResult> SavePaymentDetails([FromBody] InvoicePay details) { Result <string> result = new Result <string>(); try { using (var dbContextTransaction = _ablemusicContext.Database.BeginTransaction()) { var invoiceItem = await _ablemusicContext.Invoice.FirstOrDefaultAsync(s => s.InvoiceId == details.InvoiceId); if (invoiceItem == null) { throw new Exception("Invoice does not found."); } //the owing fee for invoice cannot be negative. if (invoiceItem.OwingFee - details.Amount < 0) { throw new Exception("You only need to pay " + invoiceItem.OwingFee + " dollar. No more than it"); } invoiceItem.PaidFee = invoiceItem.PaidFee + details.Amount; invoiceItem.OwingFee = invoiceItem.OwingFee - details.Amount; if (invoiceItem.OwingFee > 0) { invoiceItem.IsPaid = 0; } if (invoiceItem.OwingFee == 0) { invoiceItem.IsPaid = 1; } _ablemusicContext.Update(invoiceItem); await _ablemusicContext.SaveChangesAsync(); //save the Invoice payment to Payment table var paymentItem = new Payment(); _mapper.Map(details, paymentItem); paymentItem.CreatedAt = toNZTimezone(DateTime.UtcNow); paymentItem.PaymentType = 1; paymentItem.IsConfirmed = 0; _ablemusicContext.Add(paymentItem); await _ablemusicContext.SaveChangesAsync(); var fundItem = await _ablemusicContext.Fund.FirstOrDefaultAsync(s => s.LearnerId == details.LearnerId); if (fundItem == null) { var fundNewItem = new Fund(); fundNewItem.LearnerId = details.LearnerId; fundNewItem.Balance = details.Amount; fundNewItem.Balance = details.Amount; fundNewItem.UpdatedAt = toNZTimezone(DateTime.UtcNow); _ablemusicContext.Add(fundNewItem); } else { fundItem.Balance = fundItem.Balance + details.Amount; fundItem.UpdatedAt = toNZTimezone(DateTime.UtcNow); _ablemusicContext.Update(fundItem); } await _ablemusicContext.SaveChangesAsync(); if (invoiceItem.IsPaid == 1) { if (invoiceItem.CourseInstanceId != null) //if this is a one on one session // { var invoiceLessonRemain = _ablemusicContext.LessonRemain.FirstOrDefault(s => s.CourseInstanceId == invoiceItem.CourseInstanceId); if (invoiceLessonRemain != null) { invoiceLessonRemain.Quantity = invoiceLessonRemain.Quantity + invoiceItem.LessonQuantity; _ablemusicContext.Update(invoiceLessonRemain); await _ablemusicContext.SaveChangesAsync(); } else { var lessonRemain = new LessonRemain { Quantity = invoiceItem.LessonQuantity, TermId = invoiceItem.TermId, ExpiryDate = invoiceItem.EndDate.Value.AddMonths(3), CourseInstanceId = invoiceItem.CourseInstanceId, LearnerId = invoiceItem.LearnerId }; _ablemusicContext.Add(lessonRemain); await _ablemusicContext.SaveChangesAsync(); } } //if (invoiceItem.CourseInstanceId != null) //await SaveLesson(details.InvoiceId,0,1); } dbContextTransaction.Commit(); } } catch (Exception ex) { result.IsSuccess = false; result.ErrorCode = ex.Message; return(BadRequest(result)); } result.Data = "Success!"; return(Ok(result)); }
public async Task <IActionResult> Confirm(int lessonId, string reason) { Decimal? houlyWage = 0; Result <string> result = new Result <string>(); try { using (var dbContextTransaction = _ablemusicContext.Database.BeginTransaction()) { var lesson = _ablemusicContext.Lesson .Include(s => s.GroupCourseInstance) .ThenInclude(s => s.Course) .Include(s => s.GroupCourseInstance) .ThenInclude(s => s.Course) .Include(s => s.TrialCourse) .FirstOrDefault(s => s.LessonId == lessonId); if (lesson == null) { return(NotFound(DataNotFound(result))); } if (lesson.IsCanceled == 1) { throw new Exception("This lesson has already canceled"); } if (lesson.IsConfirm == 1) { throw new Exception("This lesson has already confirm."); } if (!IsNull(lesson.TrialCourse)) { lesson.IsConfirm = 1; lesson.Reason = reason; _ablemusicContext.Update(lesson); await _ablemusicContext.SaveChangesAsync(); //fund var TrailCourse = lesson.TrialCourse; var fund1 = _ablemusicContext.Fund.FirstOrDefault(s => s.LearnerId == lesson.LearnerId); fund1.Balance -= TrailCourse.Price; fund1.UpdatedAt = DateTime.Now; _ablemusicContext.Update(fund1); await _ablemusicContext.SaveChangesAsync(); //learner transaction var learnerTransaction1 = new LearnerTransaction { LessonId = lesson.LessonId, CreatedAt = toNZTimezone(DateTime.UtcNow).ToShortDateString(), Amount = TrailCourse.Price.ToString(), LearnerId = lesson.LearnerId }; _ablemusicContext.Add(learnerTransaction1); await _ablemusicContext.SaveChangesAsync(); //teacher transaction var teacherWageRate1 = _ablemusicContext.TeacherWageRates.FirstOrDefault(s => s.TeacherId == lesson.TeacherId && s.IsActivate == 1); var courseCatogoryId1 = TrailCourse.CourseCategoryId; if (courseCatogoryId1 == 1) { houlyWage = teacherWageRate1.PianoRates; } else if (courseCatogoryId1 == 7) { houlyWage = teacherWageRate1.TheoryRates; } else { houlyWage = teacherWageRate1.OthersRates; } var wageAmout1 = (double)houlyWage * (lesson.EndTime.Value.Subtract(lesson.BeginTime.Value).TotalMinutes / 60); var teacherTransaction1 = new TeacherTransaction { LessonId = lesson.LessonId, CreatedAt = toNZTimezone(DateTime.UtcNow), WageAmount = (decimal)wageAmout1, TeacherId = lesson.TeacherId }; _ablemusicContext.Add(teacherTransaction1); await _ablemusicContext.SaveChangesAsync(); dbContextTransaction.Commit(); result.Data = "success"; return(Ok(result)); } if (!IsNull(lesson.GroupCourseInstanceId)) { lesson.IsConfirm = 1; lesson.Reason = reason; _ablemusicContext.Update(lesson); await _ablemusicContext.SaveChangesAsync(); var houlywage = _ablemusicContext.TeacherWageRates .FirstOrDefault(s => s.TeacherId == lesson.TeacherId && s.IsActivate == 1).GroupRates; var GroupWageAmout = (double)houlywage * (lesson.EndTime.Value.Subtract(lesson.BeginTime.Value).TotalMinutes / 60); var teacherTransactionForGroup = new TeacherTransaction { LessonId = lesson.LessonId, CreatedAt = toNZTimezone(DateTime.UtcNow), WageAmount = (decimal)GroupWageAmout, TeacherId = lesson.TeacherId }; _ablemusicContext.Add(teacherTransactionForGroup); await _ablemusicContext.SaveChangesAsync(); dbContextTransaction.Commit(); result.Data = "success"; return(Ok(result)); } lesson.IsConfirm = 1; lesson.Reason = reason; _ablemusicContext.Update(lesson); await _ablemusicContext.SaveChangesAsync(); //lessonRemain LessonRemain lessonRemain; lessonRemain = _ablemusicContext.LessonRemain.FirstOrDefault(s => s.LearnerId == lesson.LearnerId && s.CourseInstanceId == lesson.CourseInstanceId); // if (lessonRemain == null) { var invoice = _ablemusicContext.InvoiceWaitingConfirm.FirstOrDefault(s => s.InvoiceNum == lesson.InvoiceNum && s.IsActivate == 1); var newlessonRemain = new LessonRemain { Quantity = 0, TermId = invoice.TermId, ExpiryDate = invoice.EndDate.Value.AddMonths(3), CourseInstanceId = lesson.CourseInstanceId, LearnerId = lesson.LearnerId }; _ablemusicContext.Add(newlessonRemain); await _ablemusicContext.SaveChangesAsync(); } lessonRemain = _ablemusicContext.LessonRemain.FirstOrDefault(s => s.LearnerId == lesson.LearnerId && s.CourseInstanceId == lesson.CourseInstanceId); // lessonRemain.Quantity -= 1; _ablemusicContext.Update(lessonRemain); await _ablemusicContext.SaveChangesAsync(); //fund var courseInstance = _ablemusicContext.One2oneCourseInstance.FirstOrDefault(s => s.CourseInstanceId == lesson.CourseInstanceId); var course = _ablemusicContext.Course.FirstOrDefault(s => s.CourseId == courseInstance.CourseId); var fund = _ablemusicContext.Fund.FirstOrDefault(s => s.LearnerId == lesson.LearnerId); fund.Balance -= course.Price; _ablemusicContext.Update(fund); await _ablemusicContext.SaveChangesAsync(); //learner transaction var learnerTransaction = new LearnerTransaction { LessonId = lesson.LessonId, CreatedAt = toNZTimezone(DateTime.UtcNow).ToShortDateString(), Amount = course.Price.ToString(), LearnerId = lesson.LearnerId }; _ablemusicContext.Add(learnerTransaction); await _ablemusicContext.SaveChangesAsync(); //teacher transaction var teacherWageRate = _ablemusicContext.TeacherWageRates.FirstOrDefault(s => s.TeacherId == lesson.TeacherId && s.IsActivate == 1); var courseCatogoryId = lesson.CourseInstance.Course.CourseCategoryId; if (courseCatogoryId == 1) { houlyWage = teacherWageRate.PianoRates; } else if (courseCatogoryId == 7) { houlyWage = teacherWageRate.TheoryRates; } else { houlyWage = teacherWageRate.OthersRates; } var wageAmout = (double)houlyWage * (lesson.EndTime.Value.Subtract(lesson.BeginTime.Value).TotalMinutes / 60); var teacherTransaction = new TeacherTransaction { LessonId = lesson.LessonId, CreatedAt = toNZTimezone(DateTime.UtcNow), WageAmount = (decimal)wageAmout, TeacherId = lesson.TeacherId }; _ablemusicContext.Add(teacherTransaction); await _ablemusicContext.SaveChangesAsync(); dbContextTransaction.Commit(); result.Data = "Success"; return(Ok(result)); } } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = ex.ToString(); return(BadRequest(result)); } }