示例#1
0
        public ActionResult Checkout(int id)
        {
            var status = this.orderAdapter.GetOrderForCheckout(User.Identity.Name, id);

            if (status.StatusCode != 200)
            {
                return(HttpNotFound());
            }

            OrderCheckoutModel model = new OrderCheckoutModel()
            {
                Order = status.Result,
                Input = new OrderCheckoutInputModel()
            };

            // auto-select the first payment method
            if (status.Result.User.UserCreditCards.Count > 0)
            {
                model.Input.SelectedPaymentMethod = status.Result.User.UserCreditCards.First();
            }

            return(View(model));
        }
示例#2
0
        public ActionResult Checkout(OrderCheckoutInputModel input)
        {
            if (ModelState.IsValid)
            {
                // process payment with cc, and save or update the card if requested.
                var order = this.orderAdapter.ProcessOrder(
                    User.Identity.Name, input.OrderId, input.SelectedPaymentMethod, input.SaveCard);

                //if it didn't work, build the viewmodel, add errors, and return the view.
                if (order.StatusCode != 200)
                {
                    ValidationResult error = null;

                    if (order.Errors != null)
                    {
                        error = order.Errors.FirstOrDefault();
                    }
                    if (error != null)
                    {
                        ModelState.AddModelError(error.MemberNames.First(), error.ErrorMessage);
                    }
                    else
                    {
                        ModelState.AddModelError("Order", "There was an error processing your order.");
                    }

                    UserCreditCard card = null;
                    if (order.Result.UserCreditCardId != null)
                    {
                        card = orderAdapter.GetUserCreditCard(
                            User.Identity.Name, order.Result.UserCreditCardId.Value);
                    }
                    else
                    {
                        card = new UserCreditCard();
                    }

                    var model = new OrderCheckoutModel
                    {
                        Order = order.Result,
                        Input = new OrderCheckoutInputModel
                        {
                            SaveCard = input.SaveCard,
                            SelectedPaymentMethod = card
                        }
                    };

                    return(View(model));
                }

                //otherwise, we're good

                // activate building, move reserved ribbon to purchased ribbon on building
                // if payment is successful
                this.propertyAdapter.ActivateBuilding(input.BuildingId, User.Identity.Name);

                //fulfill order here
                this.orderAdapter.FulfillCompletedOrder(User.Identity.Name, order.Result.OrderId);
            }
            else
            {
                var order = this.orderAdapter.GetOrderForCheckout(User.Identity.Name, input.OrderId);

                return(View(new OrderCheckoutModel
                {
                    Order = order.Result,
                    Input = input
                }));
            }

            //redirect to our complete page
            return(Redirect("/ksl/property/complete/" + input.BuildingId));
        }
示例#3
0
        public ActionResult Checkout(OrderCheckoutInputModel input)
        {
            if (ModelState.IsValid)
            {
                bool isNew = input.SelectedPaymentMethod.UserCreditCardId == 0;

                // process payment with cc, and save or update the card if requested.
                var order = this.orderAdapter.ProcessOrder(
                    User.Identity.Name, input.OrderId, input.SelectedPaymentMethod, input.SaveCard);

                //if it didn't work, build the viewmodel, add errors, and return the view.
                if (order.StatusCode != 200)
                {
                    ValidationResult error = null;

                    if (order.Errors != null)
                    {
                        error = order.Errors.FirstOrDefault();
                    }

                    if (error != null)
                    {
                        ModelState.AddModelError(error.MemberNames.First(), error.ErrorMessage);
                    }
                    else
                    {
                        ModelState.AddModelError("Order", "There was an error processing your order.");
                    }

                    // process order failed, so model should be ready for user to make changes and re-submit
                    var model = new OrderCheckoutModel
                    {
                        Order = order.Result,
                        Input = input
                    };

                    // new cards that failed are not saved. need to resubmit as new card again
                    if (isNew)
                    {
                        model.Input.SelectedPaymentMethod.UserCreditCardId = 0;
                    }

                    return(View(model));
                }

                //otherwise, we're good

                // activate building, move reserved ribbon to purchased ribbon on building
                // if payment is successful
                this.propertyAdapter.ActivateBuilding(input.BuildingId, User.Identity.Name);

                //fulfill order here
                this.orderAdapter.FulfillCompletedOrder(User.Identity.Name, order.Result.OrderId);
            }
            else
            {
                var order = this.orderAdapter.GetOrderForCheckout(User.Identity.Name, input.OrderId);

                return(View(new OrderCheckoutModel
                {
                    Order = order.Result,
                    Input = input
                }));
            }

            //redirect to our complete page
            return(Redirect("/listing/complete/" + input.BuildingId));
        }