public async Task<ActionResult> Order(Order order) { var item = await _listingService.FindAsync(order.ListingID); if (item == null) return new HttpNotFoundResult(); // Check if payment method is setup on user or the platform var descriptors = _pluginFinder.GetPluginDescriptors<IHookPlugin>(LoadPluginsMode.InstalledOnly, "Payment").Where(x => x.Enabled); if (descriptors.Count() == 0) { TempData[TempDataKeys.UserMessageAlertState] = "bg-danger"; TempData[TempDataKeys.UserMessage] = "[[[The provider has not setup the payment option yet, please contact the provider.]]]"; return RedirectToAction("Listing", "Listing", new { id = order.ListingID }); } foreach (var descriptor in descriptors) { var controllerType = descriptor.Instance<IHookPlugin>().GetControllerType(); var controller = ContainerManager.GetConfiguredContainer().Resolve(controllerType) as IPaymentController; if (!controller.HasPaymentMethod(item.UserID)) { TempData[TempDataKeys.UserMessageAlertState] = "bg-danger"; TempData[TempDataKeys.UserMessage] = string.Format("[[[The provider has not setup the payment option for {0} yet, please contact the provider.]]]", descriptor.FriendlyName); return RedirectToAction("Listing", "Listing", new { id = order.ListingID }); } } if (order.ID == 0) { order.ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added; order.Created = DateTime.Now; order.Modified = DateTime.Now; order.Status = (int)Enum_OrderStatus.Created; order.UserProvider = item.UserID; order.UserReceiver = User.Identity.GetUserId(); order.ListingTypeID = order.ListingTypeID; if (order.UserProvider == order.UserReceiver) { TempData[TempDataKeys.UserMessageAlertState] = "bg-danger"; TempData[TempDataKeys.UserMessage] = "[[[You cannot book the item from yourself!]]]"; return RedirectToAction("Listing", "Listing", new { id = order.ListingID }); } if (order.ToDate.HasValue && order.FromDate.HasValue) { order.Description = string.Format("{0} #{1} ([[[From]]] {2} [[[To]]] {3})", item.Title, item.ID, order.FromDate.Value.ToShortDateString(), order.ToDate.Value.ToShortDateString()); order.Quantity = order.ToDate.Value.Date.AddDays(1).Subtract(order.FromDate.Value.Date).Days; order.Price = order.Quantity * item.Price; } else if (order.Quantity.HasValue) { order.Description = string.Format("{0} #{1}", item.Title, item.ID); order.Quantity = order.Quantity.Value; order.Price = item.Price; } else { // Default order.Description = string.Format("{0} #{1}", item.Title, item.ID); order.Quantity = 1; order.Price = item.Price; } _orderService.Insert(order); } await _unitOfWorkAsync.SaveChangesAsync(); ClearCache(); return RedirectToAction("Payment", new { id = order.ID }); }
public async Task<ActionResult> Order(Order order) { var item = await _itemService.FindAsync(order.ItemID); if (item == null) return new HttpNotFoundResult(); // Get payment method var stripeConnectQuery = await _stripConnectService.Query(x => x.UserID == item.UserID).SelectAsync(); if (!stripeConnectQuery.Any()) { TempData[TempDataKeys.UserMessageAlertState] = "bg-danger"; TempData[TempDataKeys.UserMessage] = "The provider has not setup the payment option yet, please contact the provider."; return RedirectToAction("Listing", "Listing", new { id = order.ItemID }); } if (order.ID == 0) { order.ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added; order.Created = DateTime.Now; order.Modified = DateTime.Now; order.Status = (int)Enum_OrderStatus.Created; order.UserProvider = item.UserID; order.UserReceiver = User.Identity.GetUserId(); if (order.UserProvider == order.UserReceiver) { TempData[TempDataKeys.UserMessageAlertState] = "bg-danger"; TempData[TempDataKeys.UserMessage] = "You cannot book the item from yourself!"; return RedirectToAction("Listing", "Listing", new { id = order.ItemID }); } if (order.ToDate.HasValue && order.FromDate.HasValue) { order.Description = string.Format("{0} #{1} (From {2} To {3})", item.Title, item.ID, order.FromDate.Value.ToShortDateString(), order.ToDate.Value.ToShortDateString()); order.Quantity = order.ToDate.Value.Date.AddDays(1).Subtract(order.FromDate.Value.Date).Days; order.Price = order.Quantity * item.Price; } else { order.Description = string.Format("{0} #{1}", item.Title, item.ID); order.Quantity = 1; order.Price = item.Price; } _orderService.Insert(order); } await _unitOfWorkAsync.SaveChangesAsync(); ClearCache(); return RedirectToAction("Payment", new { id = order.ID }); }