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)); }
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)); }
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)); }