Пример #1
0
        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));
        }
Пример #2
0
        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"));
        }