public async Task <IActionResult> TicketRefundCreate(int id) { var ticket = await context.Tickets .Include(t => t.Excursion) .Include(t => t.Refunds) .Select(x => new { x.Id, x.AdultCount, x.ChildrenCount, x.Discount, Excursion = new { x.Excursion.PricePerAdult, x.Excursion.PricePerChild }, Refunds = x.Refunds.Select(y => new { y.AdultCount, y.ChildCount }).ToList() }) .FirstOrDefaultAsync(t => t.Id == id); if (ticket is null) { return(Redirect("/Excursion/Representative/TicketSearchById")); } var model = new RefundCreateInputModel() { MaxAdultCount = ticket.AdultCount - ticket.Refunds.Sum(r => r.AdultCount), MaxChildrenCount = ticket.ChildrenCount - ticket.Refunds.Sum(r => r.ChildCount), PricePerAdult = ticket.Excursion.PricePerAdult, PricePerChild = ticket.Excursion.PricePerChild, TicketId = ticket.Id, Discount = ticket.Discount }; model.SumToRefund = (model.MaxAdultCount * model.PricePerAdult + model.MaxChildrenCount * model.PricePerChild) * (100 - ticket.Discount) / 100.00m; //view of the ticket ( with count of adult, chidlren (max out-ed)) and below price to return return(View(model)); }
public async Task <IActionResult> TicketRefundCreate(RefundCreateInputModel model) { //validate the cases if (model.MaxAdultCount < model.AdultToRefund || model.MaxChildrenCount < model.ChildrenToRefund || model.AdultToRefund < 0 || model.ChildrenToRefund < 0) { var returnVIewModel = await context.Tickets .Include(t => t.Excursion) .Include(t => t.Refunds) .Select(x => new { x.Id, x.AdultCount, x.ChildrenCount, Excursion = new { x.Excursion.PricePerAdult, x.Excursion.PricePerChild }, Refunds = x.Refunds.Select(y => new { y.AdultCount, y.ChildCount }).ToList() }) .FirstOrDefaultAsync(t => t.Id == model.TicketId); if (returnVIewModel is null) { return(Redirect("/Excursion/Representative/TicketSearchById")); } var input = new RefundCreateInputModel() { MaxAdultCount = returnVIewModel.AdultCount - returnVIewModel.Refunds.Sum(r => r.AdultCount), MaxChildrenCount = returnVIewModel.ChildrenCount - returnVIewModel.Refunds.Sum(r => r.ChildCount), PricePerAdult = returnVIewModel.Excursion.PricePerAdult, PricePerChild = returnVIewModel.Excursion.PricePerChild, TicketId = returnVIewModel.Id }; //todo+ add one bool for validation + message! return(this.View(input)); } var ticket = await context.Tickets.Include(t => t.Sale).FirstOrDefaultAsync(t => t.Id == model.TicketId); //here i forgot the discount! var cashToRefund = (model.AdultToRefund * model.PricePerAdult + model.ChildrenToRefund * model.PricePerChild) * (100m - ticket.Discount) / 100.00m; ticket.Sale.Cash -= cashToRefund; ticket.AdultCount -= model.AdultToRefund; ticket.ChildrenCount -= model.ChildrenToRefund; ticket.Sale.TotalPrice -= cashToRefund; var refund = new Refund() { AdultCount = model.AdultToRefund, ChildCount = model.ChildrenToRefund, Cash = cashToRefund, Date = DateTime.UtcNow, TicketId = model.TicketId }; ticket.Refunds.Add(refund); await context.Refunds.AddAsync(refund); await context.SaveChangesAsync(); return(View("/Areas/Excursion/Views/Representative/Tickets/TicketRefundView.cshtml")); }