public IActionResult PlaceOrder(PizzaViewModel pvm)
        {
            CrustModel c = new CrustModel()
            {
                Name = pvm.Crust
            };
            SizeModel s = new SizeModel()
            {
                Name = pvm.Size
            };
            ToppingModel t = new ToppingModel()
            {
                Name = pvm.Toppings[0].Name
            };
            PizzaModel p = new PizzaModel()
            {
                Crust = c, Size = s, Topping = new List <ToppingModel>()
                {
                    t
                }
            };
            OrderModel o = new OrderModel()
            {
                Pizzas = new List <PizzaModel>()
                {
                    p
                }
            };

            _db.Orders.Add(o);
            return(RedirectToPage("/Home Page"));
        }
    public IActionResult OrderHistory(OrderViewModel model) {
      List<OrderModel> orders;
      try {
        _ = userLoggedIn; // exception not caught if you just use uLI
        orders = _repo.GetOrdersForUser(userLoggedIn);
      } catch (NullReferenceException) {
        model.ReasonForError = "You are not logged in. Please return to the main page to login and try again.";
        return View("Error", model);
      }

      List<OrderViewClass> orderHistory = new List<OrderViewClass>();
      foreach (OrderModel order in orders) {
        StringBuilder toppings = new StringBuilder();
        foreach (string topping in order.Toppings.Split(',')) {
          int toppingID;
          if (!int.TryParse(topping, out toppingID)) {
            Console.WriteLine($"Database error: Expected integer for pizza ID, received {topping}");
            toppings.Append("Error, ");
            continue;
          }
          ToppingModel top = _repo.GetTopping(toppingID);
          toppings.Append($"{top.Name}, ");
        }
        toppings.Remove(toppings.Length - 2, 2);
        OrderViewClass orderView = new OrderViewClass{
          OrderID = order.OrderID,
          Created = order.Created,
          Size = order.Size,
          Crust = _repo.GetCrust(order.CrustID).Name,
          Toppings = toppings.ToString(),
          Quantity = order.Quantity,
          Cost = order.TotalCost,
          StoreName = _repo.GetStore(order.StoreID).Name
        };
        if (order.PizzaID == 0) {
          orderView.Pizza = "Custom";
        } else {
          try {
            orderView.Pizza = _repo.GetPizza(order.PizzaID).Name;
          } catch (NullReferenceException) {
            Console.WriteLine($"Database error: Could not find a pizza with ID {order.PizzaID} in the Pizza table");
            orderView.Pizza = "Error";
          }
        }
        orderHistory.Add(orderView);
      }
      model.OrderHistory = orderHistory;
      return View(model);
    }
Exemple #3
0
        //CREATE, READ, UPDATE, DELETE

        public void CreatePizza(PizzaModel pizza)
        {
            pizza.Crust = db.Crust.FirstOrDefault(c => c.Name == pizza.Crust.Name);
            pizza.Size  = db.Size.FirstOrDefault(s => s.Name == pizza.Size.Name);

            foreach (ToppingModel top in pizza.Toppings)
            {
                ToppingModel top2 = db.Topping.FirstOrDefault(t => t.Name == top.Name);

                db.PizzaToppings.Add(new PizzaToppings()
                {
                    Topping = top2, Pizza = pizza
                });
            }

            db.SaveChanges();
        }
        //[ValidateAntiForgeryToken]
        public IActionResult ConfirmOrder(PizzaViewModel pizzaViewModel) //model binding
        {
            //if (ModelState.IsValid) //validating that the requirements in PizzaViewModel are being met
            //{
            CrustModel crust = new CrustModel()
            {
                Name = pizzaViewModel.Crust
            };
            SizeModel size = new SizeModel()
            {
                Name = pizzaViewModel.Size
            };
            ToppingModel topping = new ToppingModel()
            {
                Name = pizzaViewModel.SelectedTopping
            };
            List <ToppingModel> ToppingList = new List <ToppingModel>()
            {
                topping
            };
            PizzaModel pizza = new PizzaModel()
            {
                Crust = crust, Size = size, Toppings = ToppingList
            };

            _db.Pizzas.Add(pizza);
            OrderModel order = new OrderModel();

            order.UserID = pizzaViewModel.UserID;


            //order.Pizzas.Add(new PizzaModel(){})
            _db.Orders.Add(order);
            _db.SaveChanges();
            return(RedirectToAction("Summary", "User", pizzaViewModel));//http 300-series status //should probably redirect to a user/cart/ or something like that
            //}
            //return View("MainOrder");
        }
Exemple #5
0
        public OrderModel PlaceOrder(OrderModel order)
        {
            foreach (PizzaModel pizza1 in order.Pizzas)
            {
                PizzaModel pizza;

                if (!pizza1.Name.Equals("Custom"))
                {
                    pizza = db.Pizza.FirstOrDefault(p => p.Name.Equals(pizza1.Name));
                }
                else
                {
                    pizza = new PizzaModel();

                    pizza.Crust = db.Crust.FirstOrDefault(c => c.Name == pizza1.Crust.Name);
                    pizza.Size  = db.Size.FirstOrDefault(s => s.Name == pizza1.Size.Name);

                    foreach (ToppingModel topping in pizza1.Toppings)
                    {
                        ToppingModel topping2 = db.Topping.FirstOrDefault(t => t.Name == topping.Name);
                        db.PizzaToppings.Add(new PizzaToppings()
                        {
                            Pizza = pizza, Topping = topping2
                        });                                                                //Add to junction table
                    }
                }

                db.OrderPizzas.Add(new OrderPizzas()
                {
                    Order = order, Pizza = pizza
                });                                                           //Add to junction table
            }

            db.SaveChanges();

            return(order);
        }
        public void Create(PizzaModel pizza, PizzaStoreDbContext _db)
        {
            // Bind Domain PizzaModel to Storing PizzaModel
            var newPizza = new domain.PizzaModel();

            newPizza.Crust    = new domain.CrustModel();
            newPizza.Size     = new domain.SizeModel();
            newPizza.Toppings = new List <domain.ToppingModel>();

            newPizza.Crust.Name = pizza.Crust.Name;
            newPizza.Size.Name  = pizza.Size.Name;
            newPizza.Name       = pizza.Name;
            newPizza.Price      = pizza.Price;

            foreach (var t in pizza.Toppings)
            {
                List <ToppingModel> newToppings = new List <ToppingModel>();
                ToppingModel        newTopping  = new ToppingModel();
                newTopping.Name = t.Name;
                newPizza.Toppings.Add(newTopping);
            }
            _db.Pizzas.Add(newPizza);
            _db.SaveChanges();
        }
Exemple #7
0
        // [ValidateAntiForgeryToken]
        public IActionResult Post(PizzaViewModel pizzaViewModel, int id) //model binding
        {
            var return_view = "";

            switch (id)
            {
            case 1:       // set return view for standard pizza orders

                return_view = "OrderStandard";
                break;

            case 2:       // set return view for custom pizza orders
                pizzaViewModel.Type = "Custom";
                return_view         = "OrderCustom";
                break;

            default:
                break;
            }
            ;

            if (ModelState.IsValid)                //  what is the validation? (add to viewmodel)
            {
                var        p = new PizzaFactory(); // use dependency injection
                PizzaModel domainPizzaModel = new PizzaModel();
                domainPizzaModel = p.Create();     // factory-created Domain PizzaModel

                if (pizzaViewModel.Types.Contains(pizzaViewModel.Type) || pizzaViewModel.Type == "Custom")
                {
                    switch (id)
                    {
                    case 1:                                                                                        //standard pizza chosen
                        pizzaViewModel.SelectedToppings.Clear();
                        pizzaViewModel.SelectedToppings.AddRange(pizzaViewModel.ToppingSets[pizzaViewModel.Type]); // add topping sets based on chosen pizza type
                        break;

                    case 2: //custom pizza chosen
                        if (pizzaViewModel.SelectedToppings.Contains("dummy"))
                        {
                            return(View(return_view, pizzaViewModel));      // no toppings were chosen at all, return to custom pizza order page
                        }
                        break;

                    default:
                        break;
                    }

                    var pricepertopping = 1.0m;
                    switch (id)
                    {
                    case 1:   // set prices for standard pizza orders
                        domainPizzaModel.Price = pizzaViewModel.Prices[pizzaViewModel.Type];
                        break;

                    case 2:                                                        // set prices for custom pizza orders
                        domainPizzaModel.Price  = pizzaViewModel.Prices["Cheese"]; //cheapest
                        domainPizzaModel.Price += pizzaViewModel.SelectedToppings.Count * pricepertopping;
                        break;

                    default:
                        break;
                    }
                    ;
                }
                else
                {
                    domainPizzaModel.Price = pizzaViewModel.Prices["Cheese"]; //cheapest
                    pizzaViewModel.SelectedToppings.AddRange(pizzaViewModel.ToppingSets["Cheese"]);
                }

                // bind PizzaViewModel to Domain PizzaModel
                domainPizzaModel.Name = pizzaViewModel.Type;

                var newC = new CrustModel();
                newC.Name = pizzaViewModel.Crust;
                domainPizzaModel.Crust = newC;

                var newS = new SizeModel();
                newS.Name             = pizzaViewModel.Size;
                domainPizzaModel.Size = newS;

                foreach (var t in pizzaViewModel.SelectedToppings)
                {
                    var newToppings = new List <ToppingModel>();
                    var newTopping  = new ToppingModel();
                    newTopping.Name = t;
                    domainPizzaModel.Toppings.Add(newTopping);
                }

                var repo_pizza = new PizzaRepository();
                repo_pizza.Create(domainPizzaModel, _db);

                return_view = "ThankYou";
                return(View(return_view));
            }


            return(View(return_view, pizzaViewModel));
        }
Exemple #8
0
 public void Update(ToppingModel topping)
 {
     _DBContext.Toppings.Update(topping);
 }
Exemple #9
0
 public void Remove(ToppingModel topping)
 {
     _DBContext.Toppings.Remove(topping);
 }
Exemple #10
0
 public void Add(ToppingModel topping)
 {
     _DBContext.Toppings.Add(topping);
 }
        private static void SeedDB(PizzaStoreDBContext DBContext)
        {
            var Store1 = new StoreModel {
                Name = "The Pizza Store", Description = "123 West-Sdie St"
            };
            var Store2 = new StoreModel {
                Name = "The Pizza Store", Description = "123 Easat-Side St"
            };

            var Stores = new List <StoreModel>()
            {
                Store1, Store2
            };

            var Pizza1 = new PizzaModel {
                Name = "Cheese", crust = new CrustModel()
                {
                    Name = "Regular"
                }, size = new SizeModel()
                {
                    Name = "Medium"
                }, Price = 10.00M, Description = "Signature Cheese Pizza with our secret 2 blend cheese", Image = "http://placecorgi.com/250"
            };
            var Pizza2 = new PizzaModel {
                Name = "Pepperoni", crust = new CrustModel()
                {
                    Name = "Regular"
                }, size = new SizeModel()
                {
                    Name = "Medium"
                }, Price = 10.00M, Description = "Peppernoi Pizza with our secret All natural pepperoni", Image = "http://placecorgi.com/250"
            };
            var Pizza3 = new PizzaModel {
                Name = "Sausage", crust = new CrustModel()
                {
                    Name = "Regular"
                }, size = new SizeModel()
                {
                    Name = "Medium"
                }, Price = 10.00M, Description = "Sausage Pizza with spicy italian sausage", Image = "http://placecorgi.com/250"
            };
            var Pizza4 = new PizzaModel {
                Name = "Hawaiian", crust = new CrustModel()
                {
                    Name = "Regular"
                }, size = new SizeModel()
                {
                    Name = "Medium"
                }, Price = 15.00M, Description = "Hawaiian Pizza with fresh pinaple", Image = "http://placecorgi.com/250"
            };

            var Pizzas = new List <PizzaModel>()
            {
                Pizza1, Pizza2, Pizza3, Pizza4
            };

            var top1 = new ToppingModel {
                Name = "Cheese"
            };
            var top2 = new ToppingModel {
                Name = "Pepperoni"
            };
            var top3 = new ToppingModel {
                Name = "sausage"
            };
            var top4 = new ToppingModel {
                Name = "Ham"
            };
            var top5 = new ToppingModel {
                Name = "Pineapple"
            };

            var Toppings = new List <ToppingModel>()
            {
                top1, top2, top3, top4, top5
            };

            var pizzaFact = new List <PizzaFactory>()
            {
                new PizzaFactory {
                    Pizza = Pizza1, Topping = top1
                },
                new PizzaFactory {
                    Pizza = Pizza1, Topping = top1
                },
                new PizzaFactory {
                    Pizza = Pizza2, Topping = top1
                },
                new PizzaFactory {
                    Pizza = Pizza2, Topping = top2
                },
                new PizzaFactory {
                    Pizza = Pizza3, Topping = top1
                },
                new PizzaFactory {
                    Pizza = Pizza3, Topping = top3
                },
                new PizzaFactory {
                    Pizza = Pizza4, Topping = top1
                },
                new PizzaFactory {
                    Pizza = Pizza4, Topping = top4
                },
                new PizzaFactory {
                    Pizza = Pizza4, Topping = top5
                },
            };

            var order1 = new OrderModel
            {
                FName     = "Jordan",
                LName     = "Pittman",
                Address   = "123 OverThere",
                PlaceTime = DateTime.Now.AddDays(-2),
                OTotal    = 30.00M,
            };

            var orders = new List <OrderModel>()
            {
                order1
            };

            var Odetail = new List <ODetail>()
            {
                new ODetail {
                    Order = order1, Pizza = Pizza1, Total = 2, Cost = Pizza1.Price
                }
            };

            DBContext.Pizza.AddRange(Pizzas);
            DBContext.order.AddRange(orders);
            DBContext.Toppings.AddRange(Toppings);
            DBContext.PizzaToppings.AddRange(pizzaFact);
            DBContext.Odetail.AddRange(Odetail);
            DBContext.store.AddRange(Stores);

            DBContext.SaveChanges();
        }
Exemple #12
0
        public void SeedDB()
        {
            var mnger = _service.GetRequiredService <RoleManager <IdentityRole> >();
            var User  = _service.GetRequiredService <UserManager <IdentityUser> >();

            var Pizza1 = new PizzaModel {
                Name = "Cheese", crust = new CrustModel()
                {
                    Name = "Regular"
                }, size = new SizeModel()
                {
                    Name = "Medium"
                }, Price = 10.00M
            };
            var Pizza2 = new PizzaModel {
                Name = "Pepperoni", crust = new CrustModel()
                {
                    Name = "Regular"
                }, size = new SizeModel()
                {
                    Name = "Medium"
                }, Price = 10.00M
            };
            var Pizza3 = new PizzaModel {
                Name = "Sausage", crust = new CrustModel()
                {
                    Name = "Regular"
                }, size = new SizeModel()
                {
                    Name = "Medium"
                }, Price = 10.00M
            };
            var Pizza4 = new PizzaModel {
                Name = "Hawaiian", crust = new CrustModel()
                {
                    Name = "Regular"
                }, size = new SizeModel()
                {
                    Name = "Medium"
                }, Price = 15.00M
            };

            var Pizzas = new List <PizzaModel>()
            {
                Pizza1, Pizza2, Pizza3, Pizza4
            };

            var top1 = new ToppingModel {
                Name = "Cheese"
            };
            var top2 = new ToppingModel {
                Name = "Pepperoni"
            };
            var top3 = new ToppingModel {
                Name = "sausage"
            };
            var top4 = new ToppingModel {
                Name = "Ham"
            };
            var top5 = new ToppingModel {
                Name = "Pineapple"
            };

            var Toppings = new List <ToppingModel>()
            {
                top1, top2, top3, top4, top5
            };

            var pizzaFact = new List <PizzaFactory>()
            {
                new PizzaFactory {
                    Pizza = Pizza1, Topping = top1
                },
                new PizzaFactory {
                    Pizza = Pizza1, Topping = top1
                },
                new PizzaFactory {
                    Pizza = Pizza2, Topping = top1
                },
                new PizzaFactory {
                    Pizza = Pizza2, Topping = top2
                },
                new PizzaFactory {
                    Pizza = Pizza3, Topping = top1
                },
                new PizzaFactory {
                    Pizza = Pizza3, Topping = top3
                },
                new PizzaFactory {
                    Pizza = Pizza4, Topping = top1
                },
                new PizzaFactory {
                    Pizza = Pizza4, Topping = top4
                },
                new PizzaFactory {
                    Pizza = Pizza4, Topping = top5
                },
            };

            var order1 = new OrderModel
            {
                FName     = "Jordan",
                LName     = "Pittman",
                Address   = "123 OverThere",
                PlaceTime = DateTime.Now.AddDays(-2),
                OTotal    = 30.00M,
            };

            var orders = new List <OrderModel>()
            {
                order1
            };

            var Odetail = new List <ODetail>()
            {
                new ODetail {
                    Order = order1, Pizza = Pizza1, Total = 2, Cost = Pizza1.Price
                }
            };

            _DBContext.Pizza.AddRange(Pizzas);
            _DBContext.order.AddRange(orders);
            _DBContext.Toppings.AddRange(Toppings);
            _DBContext.PizzaToppings.AddRange(pizzaFact);
            _DBContext.Odetail.AddRange(Odetail);

            _DBContext.SaveChanges();
        }
        public IActionResult SalesReport(SalesReportViewModel model)
        {
            _ = storeLoggedIn;
            model.StoreName = _repo.GetStore(storeLoggedIn).Name;

            bool submitClicked = Request.Form["submit"].ToString() != "";
            bool backClicked   = Request.Form["back"].ToString() != "";

            if (submitClicked && backClicked)
            {
                Console.WriteLine("Both buttons in Sales Report registered as clicked");
                model.ReasonForError = "There was an error processing your request. Please try again.";
                return(View("SalesReport", model));
            }
            else if (submitClicked)
            {
                List <OrderModel> listOfOrders = _repo.GetOrders();

                Dictionary <DateTime, OrderViewModel> salesReport = new Dictionary <DateTime, OrderViewModel>();
                foreach (OrderModel order in listOfOrders)
                {
                    DateTime dayOfOrder            = order.Created.Date;
                    DateTime startingDayOfInterval = dayOfOrder;
                    if (model.Interval == 7)
                    {
                        startingDayOfInterval = dayOfOrder.AddDays(-((int)dayOfOrder.DayOfWeek));
                    }
                    else if (model.Interval == 30)
                    {
                        startingDayOfInterval = dayOfOrder.AddDays(-(dayOfOrder.Day - 1));
                    }
                    else
                    {
                        model.ReasonForError = "Please select an interval";
                        return(View("SalesReport", model));
                    }

                    StringBuilder toppings = new StringBuilder();
                    foreach (string topping in order.Toppings.Split(','))
                    {
                        int toppingID;
                        if (!int.TryParse(topping, out toppingID))
                        {
                            Console.WriteLine($"Database error: Expected integer for pizza ID, received {topping}");
                            toppings.Append("Error, ");
                            continue;
                        }
                        ToppingModel top = _repo.GetTopping(toppingID);
                        toppings.Append($"{top.Name}, ");
                    }
                    toppings.Remove(toppings.Length - 2, 2);
                    OrderViewClass orderView = new OrderViewClass {
                        UserID    = order.UserID,
                        OrderID   = order.OrderID,
                        Created   = order.Created,
                        Size      = order.Size,
                        Crust     = _repo.GetCrust(order.CrustID).Name,
                        Toppings  = toppings.ToString(),
                        Quantity  = order.Quantity,
                        Cost      = order.TotalCost,
                        StoreName = _repo.GetStore(order.StoreID).Name
                    };
                    if (order.PizzaID == 0)
                    {
                        orderView.Pizza = "Custom";
                    }
                    else
                    {
                        try {
                            orderView.Pizza = _repo.GetPizza(order.PizzaID).Name;
                        } catch (NullReferenceException) {
                            Console.WriteLine($"Database error: Could not find a pizza with ID {order.PizzaID} in the Pizza table");
                            orderView.Pizza = "Error";
                        }
                    }

                    try {
                        salesReport[startingDayOfInterval].OrderHistory.Add(orderView);
                    } catch (KeyNotFoundException) {
                        salesReport.Add(startingDayOfInterval, new OrderViewModel {
                            OrderHistory = new List <OrderViewClass> {
                                orderView
                            }
                        });
                    }
                }

                model.SalesReport = new Dictionary <DateTime, OrderViewModel>();
                foreach (DateTime startDate in salesReport.Keys)
                {
                    OrderViewModel orderView = salesReport[startDate];
                    model.SalesReport.Add(startDate, new OrderViewModel {
                        OrderHistory = new List <OrderViewClass>()
                    });
                    foreach (OrderViewClass order in orderView.OrderHistory)
                    {
                        string pizza = order.Pizza;
                        List <OrderViewClass> srOrderHistory = model.SalesReport[startDate].OrderHistory;
                        int i;
                        for (i = 0; i < srOrderHistory.Count(); i++)
                        {
                            OrderViewClass srOrder = model.SalesReport[startDate].OrderHistory[i];
                            if (srOrder.Pizza == pizza)
                            {
                                break;
                            }
                        }

                        if (i == srOrderHistory.Count())
                        {
                            srOrderHistory.Add(new OrderViewClass {
                                Pizza    = pizza,
                                Quantity = 1,
                                Cost     = order.Cost
                            });
                        }
                        else
                        {
                            srOrderHistory[i].Quantity += 1;
                            srOrderHistory[i].Cost     += order.Cost;
                        }
                        model.SalesReport[startDate].IntervalQuantity += 1;
                        model.SalesReport[startDate].IntervalSales    += order.Cost;
                    }
                }

                return(View("SalesReport", model));
            }
            else // if backClicked
            {
                StoreViewModel storeModel = new StoreViewModel {
                    StoreName = model.StoreName,
                    ID        = storeLoggedIn
                };
                return(View("Store", storeModel));
            }
        }
        public IActionResult OrderHistory(StoreViewModel model)
        {
            model.ID           = storeLoggedIn;
            model.StoreName    = _repo.GetStore(model.ID).Name;
            model.OrderHistory = new List <OrderViewClass>();

            bool submitClicked = Request.Form["submit"].ToString() != "";
            bool backClicked   = Request.Form["back"].ToString() != "";

            if (submitClicked && backClicked)
            {
                model.ReasonForError = "There was a problem processing your request. Please try again.";
                return(View("OrderHistory", model));
            }
            else if (backClicked)
            {
                return(Redirect("/Store/Store"));
            }

            if (model.OptionSelected != 1 && model.OptionSelected != 2)
            {
                model.ReasonForError = "There was an error processing your request. Please try again.";
                return(View("OrderHistory", model));
            }

            List <OrderModel> orders;

            if (model.OptionSelected == 1)
            {
                orders = _repo.GetOrdersForStore(model.ID);
            }
            else // if model.OptionSelected == 2
            {
                int parsedUserID;
                if (!int.TryParse(model.FilterHistoryToUser, out parsedUserID))
                {
                    model.ReasonForError = "Please enter a positive integer for a user ID";
                    return(View("OrderHistory", model));
                }
                orders = _repo.GetOrdersForStoreAndUser(model.ID, parsedUserID);
            }

            foreach (OrderModel order in orders)
            {
                StringBuilder toppings = new StringBuilder();
                foreach (string topping in order.Toppings.Split(','))
                {
                    int toppingID;
                    if (!int.TryParse(topping, out toppingID))
                    {
                        Console.WriteLine($"Database error: Expected integer for pizza ID, received {topping}");
                        toppings.Append("Error, ");
                        continue;
                    }
                    ToppingModel top = _repo.GetTopping(toppingID);
                    toppings.Append($"{top.Name}, ");
                }
                toppings.Remove(toppings.Length - 2, 2);
                OrderViewClass orderView = new OrderViewClass {
                    UserID    = order.UserID,
                    OrderID   = order.OrderID,
                    Created   = order.Created,
                    Size      = order.Size,
                    Crust     = _repo.GetCrust(order.CrustID).Name,
                    Toppings  = toppings.ToString(),
                    Quantity  = order.Quantity,
                    Cost      = order.TotalCost,
                    StoreName = _repo.GetStore(order.StoreID).Name
                };
                if (order.PizzaID == 0)
                {
                    orderView.Pizza = "Custom";
                }
                else
                {
                    try {
                        orderView.Pizza = _repo.GetPizza(order.PizzaID).Name;
                    } catch (NullReferenceException) {
                        Console.WriteLine($"Database error: Could not find a pizza with ID {order.PizzaID} in the Pizza table");
                        orderView.Pizza = "Error";
                    }
                }
                model.OrderHistory.Add(orderView);
            }

            model.ReasonForError = $"{model.OrderHistory.Count()} records found";
            return(View("OrderHistory", model));
        }
        public IActionResult Visit(int ID)
        {
            StoreModel store;

            try {
                store = _repo.GetStore(ID);
            } catch (SqlException e) {
                if (e.Message.Contains("server was not found"))
                {
                    Console.WriteLine("Could not connect to the SQL database");
                    StoreViewModel thisModel = new StoreViewModel();
                    thisModel.ReasonForError = "An internal error has occured. Please return to the main page and try again.";
                    return(View("Error", thisModel));
                }
                throw e;
            }
            if (store == null)
            {
                StoreViewModel thisModel = new StoreViewModel();
                thisModel.ReasonForError = $"A store with an ID of {ID} does not exist. Please enter a different ID from the URL, or select a store from the selection page after logging in.";
                return(View("Error", thisModel));
            }

            List <MenuModel>    items              = _repo.GetMenu(ID);
            List <PizzaModel>   pizzas             = new List <PizzaModel>();
            List <CheckModel>   pizzasToSelectFrom = new List <CheckModel>();
            List <ToppingModel> toppings           = _repo.GetToppings();

            foreach (MenuModel item in items)
            {
                PizzaModel pizza = _repo.GetPizza(item.PizzaID);
                if (pizza == null)
                {
                    Console.WriteLine($"Unknown pizza found with ID {item.PizzaID} from store {item.StoreID} at menu ID {item.ID}");
                    continue;
                }

                string[] temp = pizza.DefaultToppings.Split(',');
                int[]    defaultToppingIDs = new int[temp.Length];
                for (int i = 0; i < temp.Length; i++)
                {
                    if (!int.TryParse(temp[i], out defaultToppingIDs[i]))
                    {
                        Console.WriteLine($"Database error: Expected integer for default topping ID in pizza {pizza.ID}, got {temp[i]}");
                        continue;
                    }
                }

                pizzas.Add(pizza);
                CrustModel         crust            = _repo.GetCrust(pizza.DefaultCrustID);
                ToppingViewModel[] toppingsSelected = new ToppingViewModel[toppings.Count()];
                for (int i = 0; i < toppingsSelected.Length; i++)
                {
                    ToppingModel topping = toppings[i];
                    toppingsSelected[i] = new ToppingViewModel {
                        ID = topping.ID, Name = topping.Name, IsSelected = defaultToppingIDs.Contains(topping.ID)
                    };
                }
                pizzasToSelectFrom.Add(new CheckModel {
                    ID = pizza.ID, Name = pizza.Name, Checked = false, Cost = pizza.Cost, DefaultCrust = crust.ID, SelectedCrust = crust.ID.ToString(), SelectedToppings = toppingsSelected
                });
            }

            List <SelectListItem> crustDropDownOptions = new List <SelectListItem>();

            foreach (CrustModel crust in _repo.GetCrusts())
            {
                crustDropDownOptions.Add(new SelectListItem {
                    Text = crust.Name, Value = crust.ID.ToString()
                });
            }

            StoreViewModel model = new StoreViewModel();

            model.StoreName = store.Name;
            model.Menu      = pizzasToSelectFrom;
            try {
                _ = userLoggedIn; // keeps the session data alive
            } catch (NullReferenceException) {
                // people can view menus if they're not logged in, but not order
            }
            model.Crusts   = crustDropDownOptions;
            model.Toppings = toppings;

            TempData["StoreID"] = store.ID;
            TempData.Keep("StoreID");

            return(View(model));
        }
        public IActionResult SubmitOrder(StoreViewModel model)
        {
            TempData.Keep("StoreID");
            int storeID = (int)TempData["StoreID"];

            try {
                _ = userLoggedIn;
            } catch (NullReferenceException) {
                model.ReasonForError = "You are not logged into the system. You will only be able to view menus until you return to the main page and log in.";
                return(View("Visit", model));
            }

            StoreModel store = _repo.GetStore(storeID);

            model.StoreName = store.Name;
            // reference needs to be re-established if an error occurs submitting the order
            List <SelectListItem> c = new List <SelectListItem>();

            foreach (CrustModel crust in _repo.GetCrusts())
            {
                c.Add(new SelectListItem {
                    Text = crust.Name, Value = crust.ID.ToString()
                });
            }
            model.Crusts = c;

            bool submitOrderClicked    = Request.Form["SubmitOrder"].ToString() != "";
            bool addCustomPizzaClicked = Request.Form["AddCustom"].ToString() != "";
            bool backButtonClicked     = Request.Form["Back"].ToString() != "";
            int  buttonsClicked        = (submitOrderClicked ? 1 : 0) + (addCustomPizzaClicked ? 1 : 0) + (backButtonClicked ? 1 : 0);

            if (buttonsClicked > 1)
            {
                Console.WriteLine("Multiple buttons registered as clicked on the menu page");
                model.ReasonForError = "There was a problem processing your request. Please try again.";
                return(View("Visit", model));
            }
            else if (submitOrderClicked)
            {
                Tuple <int, string> userCanOrder = _repo.UserCanOrder(storeID, userLoggedIn);
                if (userCanOrder.Item1 == 1)
                {
                    model.ReasonForError = $"You cannot place another order at any store for {userCanOrder.Item2}";
                    return(View("Visit", model));
                }
                else if (userCanOrder.Item1 == 2)
                {
                    model.ReasonForError = $"You cannot place another order at this store for {userCanOrder.Item2}";
                    return(View("Visit", model));
                }

                decimal overallCost     = 0.00M;
                int     overallQuantity = 0;

                int max = _repo.GetNextOrderNumber();

                bool noIssues = true;
                foreach (CheckModel selectedPizza in model.Menu)
                {
                    if (selectedPizza.Checked)
                    {
                        string size = selectedPizza.SelectedSize.ToString().ToLower();
                        if (Enum.IsDefined(typeof(Size), size))
                        {
                            model.ReasonForError = $"Invalid size on pizza {selectedPizza.Name}";
                            return(View("Visit", model));
                        }
                        if (selectedPizza.Quantity == 0)
                        {
                            model.ReasonForError = $"{selectedPizza.Name} pizza must have a quantity greater than 0 if selected to be ordered";
                            return(View("Visit", model));
                        }
                        else if (selectedPizza.Quantity < 0)
                        {
                            model.ReasonForError = $"{selectedPizza.Name} pizza must have a positive quantity greater";
                            return(View("Visit", model));
                        }

                        int        crustID;
                        CrustModel crust = null;
                        if (int.TryParse(selectedPizza.SelectedCrust, out crustID))
                        {
                            crust = _repo.GetCrust(crustID);
                        }
                        if (crust == null)
                        {
                            model.ReasonForError = $"No crust was selected on the {selectedPizza.Name} pizza. Please try selecting a different crust.";
                            return(View("Visit", model));
                        }

                        PizzaModel pizza;
                        if (selectedPizza.ID != 0)
                        {
                            pizza = _repo.GetPizza(selectedPizza.ID);
                        }
                        else
                        {
                            pizza = new PizzaModel {
                                Cost = 20.00M
                            };
                        }
                        if (pizza == null)
                        {
                            Console.WriteLine($"Unknown pizza with ID {selectedPizza.ID} submitted; skipping");
                            continue;
                        }
                        decimal costOfThesePizzas = pizza.Cost * (decimal)selectedPizza.Quantity;
                        string  toppingIDs        = "";
                        int     toppingCount      = 0;
                        foreach (ToppingViewModel topping in selectedPizza.SelectedToppings)
                        {
                            if (topping.IsSelected)
                            {
                                toppingIDs += $"{topping.ID},";
                                toppingCount++;
                            }
                        }
                        if (toppingCount > 5)
                        {
                            model.ReasonForError = $"{selectedPizza.Name} has more than 5 toppings selected. Please uncheck some toppings on this pizza.";
                            return(View("Visit", model));
                        }
                        else if (toppingCount < 2)
                        {
                            model.ReasonForError = $"{selectedPizza.Name} needs at least 2 toppings selected. Please add some more toppings on this pizza.";
                            return(View("Visit", model));
                        }
                        toppingIDs = toppingIDs.Substring(0, toppingIDs.Length - 1);


                        noIssues &= _repo.AddOrder(new OrderModel {
                            OrderID   = max + 1,
                            StoreID   = storeID,
                            PizzaID   = pizza.ID,
                            UserID    = userLoggedIn,
                            Created   = DateTime.Now,
                            Quantity  = selectedPizza.Quantity,
                            TotalCost = costOfThesePizzas,
                            Size      = selectedPizza.SelectedSize.ToString(),
                            CrustID   = crust.ID,
                            Toppings  = toppingIDs
                        });
                        overallCost     += costOfThesePizzas;
                        overallQuantity += selectedPizza.Quantity;
                    }
                }
                if (overallCost > 250.00M)
                {
                    model.ReasonForError = "This order exceeds $250. Please remove some pizzas, then try again.";
                    return(View("Visit", model));
                }
                else if (overallQuantity > 50)
                {
                    model.ReasonForError = "This order exceeds 50 pizzas. Please remove some pizzas, then try again.";
                    return(View("Visit", model));
                }
                else if (overallQuantity == 0)
                {
                    model.ReasonForError = "There are no pizzas in this order. Please add some pizzas, then try again.";
                    return(View("Visit", model));
                }
                else if (!noIssues)
                {
                    model.ReasonForError = "There was a problem adding some pizzas to your order";
                }

                return(View("Submitted"));
            }
            else if (addCustomPizzaClicked)
            {
                List <ToppingModel> toppings         = _repo.GetToppings();
                ToppingViewModel[]  toppingsSelected = new ToppingViewModel[toppings.Count()];
                for (int i = 0; i < toppingsSelected.Length; i++)
                {
                    ToppingModel topping = toppings[i];
                    toppingsSelected[i] = new ToppingViewModel {
                        ID = topping.ID, Name = topping.Name, IsSelected = false
                    };
                }
                model.Menu.Add(new CheckModel {
                    ID = 0, Name = "Custom", Checked = true, Cost = 20.00M, DefaultCrust = 0, SelectedToppings = toppingsSelected
                });
                return(View("Visit", model));
            }
            else if (backButtonClicked)
            {
                return(Redirect("/User/StoreSelection"));
            }
            else // no buttons check is placed down here to remove the 'not all code paths return a value' error
            {
                Console.WriteLine("Request was sent but no buttons registered as clicked");
                model.ReasonForError = "There was a problem processing your request. Please try again.";
                return(View("Visit", model));
            }
        }