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));
        }
Example #2
0
        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));
            }
        }