using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using System.Web.Security; using HeuristicLab.Services.Optimization.Billing.Business; using HeuristicLab.Services.Optimization.Billing.Interfaces; using HeuristicLab.Services.Optimization.Billing.Model; using HeuristicLab.Services.Optimization.Web.Models; using HeuristicLab.Services.Optimization.Web.Helpers; namespace HeuristicLab.Services.Optimization.Web.Controllers { [Authorize(Roles = "Web User")] [BillingFilterActionAttribute] public class OrderController : BaseController { private IOptimizationBilling billing = BillingServiceProvider.Instance; // // GET: /Order/ public ActionResult Index() { if (RedirectToLoginIfNecessary("Order", false)) return View(); return CreateOrder(new OrderModel()); //View(); } public ActionResult Overview() { if (RedirectToLoginIfNecessary("Order", false)) return View(); MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */); var orders = billing.GetOrders(currentUser.UserName); return View(new OverviewModel() { Orders = orders }); } [HttpPost] public ActionResult CreateOrder(OrderModel model) { if (RedirectToLoginIfNecessary("Order", false)) return View(); Session["order"] = model; var currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */); if (billing.GetUser(currentUser.UserName) == null) { billing.SaveUser(new User() { Name = currentUser.UserName, PaymentInformation = new List() }); } model.User = billing.GetUser(currentUser.UserName); return AddProduct(); } public ActionResult AddProduct() { return View("AddProduct", new ProductsModel() { Products = billing.GetProducts() }); } [HttpPost] public ActionResult AddProduct(ProductsModel product) { var order = Session["order"] as OrderModel; var prod = (from b in billing.GetProducts() where b.ProductId == product.ProductId select b).FirstOrDefault(); order.ProductQuantities[prod.ProductId] = product.Quantity; return AddProduct(); } public ActionResult SaveOrder() { var orderModel = Session["order"] as OrderModel; foreach (var key in orderModel.ProductQuantities.Keys) { var product = (from p in billing.GetProducts() where p.ProductId == key select p).FirstOrDefault(); orderModel.Products[key] = product; } return View(orderModel); } [HttpPost] [ActionName("SaveOrder")] public ActionResult SaveOrderPost(OrderModel orderModel) { var orderProductModel = Session["order"] as OrderModel; //TODO: Save order via back-end var order = new Order() { State = OrderState.Created, User = new User() { Name = Membership.GetUser().UserName }, BillingType = orderModel.BillingType, BillingPeriod = orderModel.BillingPeriod }; var orderLines = new List(); var products = billing.GetProducts(); foreach (var key in orderProductModel.ProductQuantities.Keys) { var product = (from p in products where p.ProductId == key select p).FirstOrDefault(); orderLines.Add(new OrderLine() { Order = order, Product = product, ProductPrice = product.Price, Quantity = orderProductModel.ProductQuantities[key] }); } order.OrderLines = orderLines; billing.SaveOrder(order); return RedirectToAction("OrderSaved"); } public ActionResult Payment() { var paymentModel = new PaymentModel(); return View(paymentModel); } [HttpPost] public ActionResult SavePayment(PaymentModel model) { var user = billing.GetUser(UserName); var oldInfo = (from pi in user.PaymentInformation where pi.CardNumber == model.CardNumber select pi).FirstOrDefault(); if (oldInfo != null) { oldInfo.AdditionalInformation = model.AdditionalInformation; oldInfo.PaymentMethod = model.Method; billing.SaveUser(user); } else { user.PaymentInformation.Add(new PaymentInformation() { CardNumber = model.CardNumber, AdditionalInformation = model.AdditionalInformation, PaymentMethod = model.Method }); } return RedirectToAction("SaveOrder"); } public ActionResult OrderSaved() { return View(); } } }