Esempio n. 1
0
        public async Task <IActionResult> PrepareOrder(PrepareProductViewModel model, string paypalOrderId, bool capture)
        {
            var userback = await userManager.GetUserAsync(User);

            PaymentSetting paymentCredential = await context.PaymentManages.FirstOrDefaultAsync();

            PayPal paypal = new PayPal(httpContextAccessor, context, paymentCredential.IsLive);

            if (!model.ShouldProcess)
            {
                var prepareModel = new PrepareProductViewModel();
                prepareModel = model;

                var countries = await shippingPriceCrud.GetAll();

                ViewData["Countries"] = new SelectList(countries.OrderBy(m => m.Country), "Id", "Country");

                var cartsback = await context.Carts.Where(m => m.UserId.Equals(userback.Id))
                                .Include(m => m.Product).ThenInclude(m => m.Images).ToListAsync();

                List <Models.Product.Product> products = new List <Models.Product.Product>();
                foreach (var item in cartsback)
                {
                    products.Add(await productCrud.GetById(m => m.Id == item.ProductId));
                    prepareModel.Quantity.Add(item.Quantity);
                }

                if (model.Country != null)
                {
                    var shippingPrice = await shippingPriceCrud.GetFirst(m => m.Id.Equals(model.Country));

                    if (shippingPrice != null)
                    {
                        prepareModel.Country       = shippingPrice.Id;
                        prepareModel.ShippingPrice = shippingPrice.Price;
                        prepareModel.TotalPrice   += shippingPrice.Price;
                    }
                }

                if (model.DiscountCode != null)
                {
                    var action = await CheckCoupon(model, userback.Id);

                    if (action > 0)
                    {
                        model.TotalPrice = action + prepareModel.ShippingPrice;
                    }
                    else
                    {
                        ViewData["invalid"] = "invalid coupon or you used this coupon before ";
                    }
                }

                prepareModel.ShouldProcess = true;
                prepareModel.Products      = products;

                ViewData["OrderId"] = await paypal.CreateOrder(decimal.Round(prepareModel.TotalPrice, 2, MidpointRounding.AwayFromZero), "GBP");

                ViewData["ClientId"]    = paymentCredential.ClientId;
                ViewData["ClientToken"] = HttpContext.Request.Cookies["client_token"] ?? await paypal.GenerateClientToken();

                ViewData["Currency"] = "GBP";

                return(View(prepareModel));
            }

            var user = await userManager.GetUserAsync(User);

            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            if (capture)
            {
                if (!await paypal.Capture(paypalOrderId))
                {
                    return(Redirect("/home/error"));
                }
            }

            if (!await paypal.IsPayed(paypalOrderId))
            {
                return(Redirect("/home/error"));
            }

            var carts = await cartCrud.GetAll(m => m.UserId.Equals(user.Id));

            var country = await shippingPriceCrud.GetById(m => m.Id.Equals(model.Country));

            var order = await orderCrud.Add(new Models.Product.Order
            {
                PaymentId   = paypalOrderId,
                UserId      = userback.Id,
                FirstName   = model.FirstName,
                LastName    = model.LastName,
                Address     = model.Address,
                Apartment   = model.Apartment,
                City        = model.City,
                Country     = country.Country,
                PostalCode  = model.PostalCode,
                PhoneNumber = model.PhoneNumber,
                OrderStatus = OrderStatus.Processing,
                Email       = userback.Email,
                OrderNumber = new Random().Next(1, 9999),
            });

            foreach (var cart in carts)
            {
                var orders = await orderProductCrud.Add(new OrderProduct
                {
                    OrderId      = order.Id,
                    Order        = order,
                    PaymentId    = order.PaymentId,
                    ProductId    = cart.ProductId,
                    ProductPrice = cart.TotalPrice / cart.Quantity,
                    TotalPrice   = cart.TotalPrice,
                    Quantity     = cart.Quantity,
                    BaseUser     = user,
                    UserId       = user.Id,
                });

                await cartCrud.Delete(m => m.UserId.Equals(user.Id));
            }

            await DoneCheckCoupon(model, userback.Id);

            var couponHasDone = await crud.GetById(m => m.Code.Equals(model.DiscountCode));

            if (couponHasDone != null)
            {
                var endcoupon = await couponUsedCrud.GetFirst(m => m.CouponId.Equals(couponHasDone.Id) && m.BaseUserId.Equals(userback.Id));

                endcoupon.Invalid = true;
                await couponUsedCrud.Update(endcoupon);
            }
            TempData["SuccessPayment"] = $"Your order with number{order.OrderNumber} has been received and is now being processed we have sent you  a receipt to your registered email";
            return(RedirectToAction("OrderHistory", "Home"));
        }