예제 #1
0
        public void Order()
        {
            using IPizzaboxRepository pizzaboxRepository = DbOptions.CreatePizzaboxRepository();
            Orders               MyOrder  = new Orders();
            Ordertype            ODetails = new Ordertype();
            Order_tracker        Tracker;
            List <Order_tracker> Q = new List <Order_tracker>();

            MyOrder.Username = CurrentUser.Username;

            decimal total_cost = 0.00m;
            int     pizzas     = 0;
            int     preset_amt = 0;
            int     custom_amt = 0;

            string p_sequence = "";           //save sequence (holds full order for preset)
            string c_sequence = "";           //save sequence (holds full order for custom)

            //USER INPUT DESIRED LOCATION
            int count = 0;

            trials = 3;
            do
            {
                count = Locations();
                Console.Write("Pick a location (Enter ID Here): ");
                var locationid = Console.ReadLine();
                Console.Clear();
                if (int.TryParse(locationid, out int id))
                {
                    if (id < 1 || id > count)
                    {
                        if (trials > 1)
                        {
                            Console.WriteLine("Please enter a digit according to store IDs displayed below:");
                        }
                    }
                    else
                    {
                        MyOrder.StoreId = id;
                        break;
                    }
                }
                else
                {
                    if (trials > 1)
                    {
                        Console.WriteLine("Please enter a digit according to store IDs displayed below:");
                    }
                }

                trials--;
            } while (trials > 0);
            if (trials < 1)
            {
                Console.WriteLine("Sorry, we tend to think inside the box.\nYou can always contact us directly at 7499274992 (PIZZAPIZZA).\n");
                Exit();
                return;
            }

            var result = pizzaboxRepository.GetStoreById(MyOrder.StoreId);
            //var results = from s in DB.Store where s.StoreId == MyOrder.StoreId select s;
            string answer;
            bool   another, shown, ispreset, iscustom, error;

            do
            {
                answer   = "";
                shown    = false;
                error    = false;
                ispreset = false;
                iscustom = false;
                another  = false;

                Tracker.preset       = false;
                Tracker.preset_order = "";
                Tracker.size         = "";
                Tracker.sauce        = "";
                Tracker.crust        = "";
                Tracker.cheese       = "";
                Tracker.amt          = 0;
                Tracker.toppings     = new string[toppings_arraylen];
                Tracker.cost         = 0.00m;
                for (int i = 0; i < Tracker.toppings.Length; i++)
                {
                    Tracker.toppings[i] = "";
                }

                //PRESET OR CUSTOM
                Console.WriteLine("You are ordering from the " + result.City + " store.\n");

                trials = 3;
                do
                {
                    Console.WriteLine("Would you like a Preset or Custom pizza?");
                    if (!shown)
                    {
                        Console.WriteLine();
                        Console.WriteLine("For menu, just enter \"menu\" at any time.");
                        Console.WriteLine("For additional information, just enter \"info\" or \"help\".");
                        shown = true;
                    }

                    Console.Write("Order (style): ");
                    answer = Console.ReadLine();
                    Console.Clear();
                    Console.WriteLine("You are ordering from the " + result.City + " store.\n");
                    switch (answer.ToLower())
                    {
                    case "menu":
                    case "\"menu\"":
                    case "m":
                        Console.WriteLine("MENU");
                        Menu();
                        break;

                    case "info":
                    case "help":
                    case "\"info\"":
                    case "\"help\"":
                    case "i":
                    case "h":
                        Console.WriteLine("Sure thing...");
                        Console.WriteLine("Our pizzas come in two styles:");
                        Console.WriteLine("1. Preset - Pre-built specialty pizzas designed by our chef");
                        Console.WriteLine("2. Custom - Be a boss and choose your own toppings\n");
                        break;

                    case "preset":
                    case "1. preset":
                    case "1":
                    case "p":
                        ispreset       = true;
                        Tracker.preset = true;
                        break;

                    case "custom":
                    case "2. custom":
                    case "2":
                    case "c":
                        iscustom = true;
                        break;

                    default:
                        CLError(answer);
                        break;
                    }

                    // now that Tracker.preset, these are unnecessary variables (deal with it later)!!!
                    if (ispreset || iscustom)
                    {
                        break;
                    }
                } while (trials > 0);
                if (trials < 1)
                {
                    return;
                }

                //AMOUNT PRESET/CUSTOM
                trials = 3;
                do
                {
                    Console.WriteLine("How many would you like?");
                    Console.Write("Order (enter digit): ");
                    answer = Console.ReadLine();
                    Console.Clear();
                    Console.WriteLine("You are ordering from the " + result.City + " store.\n");
                    if (int.TryParse(answer, out int number))
                    {
                        if (number < 1)
                        {
                            //computecost(); make this a method and return out!!!
                            //or make a jump (take the leap)
                            ComputeOrder(Tracker, Q, total_cost);
                            //add order to db!!!
                            return;
                        }
                        pizzas += number;
                        if (pizzas > 100)
                        {
                            pizzas -= number;

                            if (trials > 1)
                            {
                                Console.Write("Orders limited to 100 pizzas at a time: ");
                                if (100 - pizzas > 0)
                                {
                                    Console.WriteLine(100 - pizzas + " remaining");
                                }

                                error = true;
                            }
                            else
                            {
                                Console.WriteLine("Sorry, we tend to think inside the box.\nYou can always contact us directly at 7499274992 (PIZZAPIZZA).\n");
                                Exit();
                                return;
                            }
                        }
                        else if (ispreset)
                        {
                            preset_amt += number;
                            p_sequence += answer;
                        }
                        else
                        {
                            custom_amt += number;
                            c_sequence += answer;
                        }

                        if (!error)
                        {
                            Tracker.amt = number;
                            break;
                        }
                    }
                    else
                    {
                        if (trials > 1)
                        {
                            Console.WriteLine("Please enter a digit amount.");
                        }
                        else
                        {
                            CLError(answer);
                            return;
                        }
                    }

                    trials--;
                } while (trials > 0);

                //PRESET ORDER SPECIFIC
                if (ispreset)
                {
                    //PRESET NAME
                    trials = 3;
                    do
                    {
                        Console.WriteLine("Please choose from the menu below:");
                        Console.WriteLine("Preset");
                        Console.WriteLine("1. Vegan | Small $4 | Medium $8 | Large $12");
                        Console.WriteLine("2. Pepperoni | Small $5 | Medium $10 | Large $15");
                        Console.WriteLine("3. BBQ Chicken | Small $6 | Medium $12 | Large $18");
                        Console.WriteLine("4. Meatball | Small $7 | Medium $14 | Large $21");
                        Console.WriteLine("5. Supreme | Small $8 | Medium $16 | Large $24");
                        Console.WriteLine("6. Greek | Small $9 | Medium $18 | Large $27\n");

                        Console.Write("Order (enter digit): ");
                        answer = Console.ReadLine();
                        Console.Clear();
                        Console.WriteLine("You are ordering from the " + result.City + " store.\n");
                        switch (answer.ToLower())
                        {
                        case "1":
                        case "vegan":
                            Tracker.preset_order = "VEGAN";
                            break;

                        case "2":
                        case "pepperoni":
                            Tracker.preset_order = "PEPPERONI";
                            break;

                        case "3":
                        case "bbq":
                        case "chicken":
                        case "bbq chicken":
                            Tracker.preset_order = "BBQ CHICKEN";
                            break;

                        case "4":
                        case "meatball":
                        case "meat":
                            Tracker.preset_order = "MEATBALL";
                            break;

                        case "5":
                        case "supreme":
                            Tracker.preset_order = "SUPREME";
                            break;

                        case "6":
                        case "greek":
                            Tracker.preset_order = "GREEK";
                            break;

                        default:
                            CLError(answer);
                            break;
                        }

                        if (Tracker.preset_order.Length > 0)
                        {
                            break;
                        }
                    } while (trials > 0);
                    if (trials < 1)
                    {
                        return;
                    }
                }

                //SIZE
                trials = 3;
                do
                {
                    Console.WriteLine("Would you like that in a Small, Medium, or Large?");
                    Console.Write("Order (size): ");
                    answer = Console.ReadLine();
                    Console.Clear();
                    Console.WriteLine("You are ordering from the " + result.City + " store.\n");
                    switch (answer.ToLower())
                    {
                    case "s":
                    case "sm":
                    case "small":
                        if (ispreset)
                        {
                            p_sequence += "S";
                        }
                        else
                        {
                            c_sequence   += "S";
                            Tracker.cost += Tracker.amt * 3.00m;
                        }

                        Tracker.size = "SMALL";
                        break;

                    case "m":
                    case "md":
                    case "medium":
                        if (ispreset)
                        {
                            p_sequence += "M";
                        }
                        else
                        {
                            c_sequence   += "M";
                            Tracker.cost += Tracker.amt * 6.00m;
                        }

                        Tracker.size = "MEDIUM";
                        break;

                    case "l":
                    case "lg":
                    case "large":
                        if (ispreset)
                        {
                            p_sequence += "L";
                        }
                        else
                        {
                            c_sequence   += "L";
                            Tracker.cost += Tracker.amt * 9.00m;
                        }

                        Tracker.size = "LARGE";
                        break;

                    default:
                        CLError(answer);
                        break;
                    }

                    if (Tracker.size.Length > 0)
                    {
                        break;
                    }
                } while (trials > 0);
                if (trials < 1)
                {
                    return;
                }

                //IF PRESET, GO AHEAD AND CALCULATE COST
                if (Tracker.preset)
                {
                    switch (Tracker.preset_order)
                    {
                    case "VEGAN":
                        //put the entire switch statement in a method and take in as parameter decimal starting val (V:4.00, P:5.00, etc) and Tracker.size
                        //then just call the method in each case with different arguments
                        switch (Tracker.size)
                        {
                        case "SMALL":
                            Tracker.cost = Tracker.amt * 4.00m;
                            break;

                        case "MEDIUM":
                            Tracker.cost = Tracker.amt * 8.00m;
                            break;

                        case "LARGE":
                            Tracker.cost = Tracker.amt * 12.00m;
                            break;
                        }
                        break;

                    case "PEPPERONI":
                        switch (Tracker.size)
                        {
                        case "SMALL":
                            Tracker.cost = Tracker.amt * 5.00m;
                            break;

                        case "MEDIUM":
                            Tracker.cost = Tracker.amt * 10.00m;
                            break;

                        case "LARGE":
                            Tracker.cost = Tracker.amt * 15.00m;
                            break;
                        }
                        break;

                    case "BBQ CHICKEN":
                        switch (Tracker.size)
                        {
                        case "SMALL":
                            Tracker.cost = Tracker.amt * 6.00m;
                            break;

                        case "MEDIUM":
                            Tracker.cost = Tracker.amt * 12.00m;
                            break;

                        case "LARGE":
                            Tracker.cost = Tracker.amt * 18.00m;
                            break;
                        }
                        break;

                    case "MEATBALL":
                        switch (Tracker.size)
                        {
                        case "SMALL":
                            Tracker.cost = Tracker.amt * 7.00m;
                            break;

                        case "MEDIUM":
                            Tracker.cost = Tracker.amt * 14.00m;
                            break;

                        case "LARGE":
                            Tracker.cost = Tracker.amt * 21.00m;
                            break;
                        }
                        break;

                    case "SUPREME":
                        switch (Tracker.size)
                        {
                        case "SMALL":
                            Tracker.cost = Tracker.amt * 8.00m;
                            break;

                        case "MEDIUM":
                            Tracker.cost = Tracker.amt * 16.00m;
                            break;

                        case "LARGE":
                            Tracker.cost = Tracker.amt * 24.00m;
                            break;
                        }
                        break;

                    case "GREEK":
                        switch (Tracker.size)
                        {
                        case "SMALL":
                            Tracker.cost = Tracker.amt * 9.00m;
                            break;

                        case "MEDIUM":
                            Tracker.cost = Tracker.amt * 18.00m;
                            break;

                        case "LARGE":
                            Tracker.cost = Tracker.amt * 27.00m;
                            break;
                        }
                        break;
                    }
                }

                //CRUST
                trials = 3;
                do
                {
                    Console.WriteLine("Crust Thick or Thin?");
                    Console.Write("Order (crust): ");
                    answer = Console.ReadLine();
                    Console.Clear();
                    Console.WriteLine("You are ordering from the " + result.City + " store.\n");
                    switch (answer.ToLower())
                    {
                    case "1":
                    case "thick":
                    case "thick crust":
                        if (ispreset)
                        {
                            p_sequence += "k";
                        }
                        else
                        {
                            c_sequence += "k";
                        }

                        Tracker.crust = "THICK";
                        break;

                    case "2":
                    case "thin":
                    case "thin crust":
                        if (ispreset)
                        {
                            p_sequence += "n";
                        }
                        else
                        {
                            c_sequence += "n";
                        }

                        Tracker.crust = "THIN";
                        break;

                    default:
                        CLError(answer);
                        break;
                    }

                    if (Tracker.crust.Length > 0)
                    {
                        break;
                    }
                } while (trials > 0);
                if (trials < 1)
                {
                    return;
                }

                //CUSTOM ORDER SPECIFIC
                if (iscustom)
                {
                    //SAUCE
                    trials = 3;
                    do
                    {
                        Console.WriteLine("Choose a sauce:");
                        Console.WriteLine("1. Traditional $0.50");
                        Console.WriteLine("2. BBQ $1");
                        Console.WriteLine("3. Alfredo $1\n");

                        Console.Write("Order (enter digit): ");
                        answer = Console.ReadLine();
                        Console.Clear();
                        Console.WriteLine("You are ordering from the " + result.City + " store.\n");
                        switch (answer.ToLower())
                        {
                        case "1":
                        case "traditional":
                        case "trad":
                            Tracker.sauce = "TRADITIONAL";
                            Tracker.cost += Tracker.amt * 0.50m;
                            break;

                        case "2":
                        case "bbq":
                        case "barbeque":
                            Tracker.sauce = "BBQ";
                            Tracker.cost += Tracker.amt * 1.00m;
                            break;

                        case "3":
                        case "alfredo":
                        case "fredo":
                            Tracker.sauce = "ALFREDO";
                            Tracker.cost += Tracker.amt * 1.00m;
                            break;

                        default:
                            CLError(answer);
                            break;
                        }

                        if (Tracker.sauce.Length > 0)
                        {
                            break;
                        }
                    } while (trials > 0);
                    if (trials < 1)
                    {
                        return;
                    }

                    //CHEESE
                    trials = 3;
                    do
                    {
                        Console.WriteLine("Pick a cheese:");
                        Console.WriteLine("0. None");
                        Console.WriteLine("1. Regular $0.50");
                        Console.WriteLine("2. Goat (Greek) $1");
                        Console.WriteLine("3. Queso $2\n");

                        Console.Write("Order (enter digit): ");
                        answer = Console.ReadLine();
                        Console.Clear();
                        Console.WriteLine("You are ordering from the " + result.City + " store.\n");
                        switch (answer.ToLower())
                        {
                        case "":
                        case "0":
                        case "none":
                        case "no":
                        case "no cheese":
                        case "no thanks":
                        case "no thankyou":
                        case "no thank you":
                            Tracker.cheese = "NONE";
                            break;

                        case "1":
                        case "regular":
                        case "reg":
                            Tracker.cheese = "REGULAR";
                            Tracker.cost  += Tracker.amt * 0.50m;
                            break;

                        case "2":
                        case "goat":
                        case "greek":
                        case "goat (greek)":
                        case "goat greek":
                        case "greek goat":
                            Tracker.cheese = "GOAT";
                            Tracker.cost  += Tracker.amt * 1.00m;
                            break;

                        case "3":
                        case "queso":
                        case "queso fresco":
                        case "fresco":
                            Tracker.cheese = "QUESO";
                            Tracker.cost  += Tracker.amt * 2.00m;
                            break;

                        default:
                            CLError(answer);
                            break;
                        }

                        if (Tracker.cheese.Length > 0)
                        {
                            break;
                        }
                    } while (trials > 0);
                    if (trials < 1)
                    {
                        return;
                    }

                    //TOPPINGS
                    trials = 3;
                    do
                    {
                        Console.WriteLine("Pick your toppings.");
                        Console.WriteLine("For multiple toppings, simply enter a stream of digits up to four.");
                        Console.WriteLine("For any less, you will need to press enter twice:");
                        Console.WriteLine("0. None");
                        Console.WriteLine("1. Veggies/Fruit $0.50");
                        Console.WriteLine("2. Pepperoni $1");
                        Console.WriteLine("3. Chicken $1");
                        Console.WriteLine("4. Meatballs $3\n");

                        Console.Write("Order (enter digit/s): ");
                        answer = Console.ReadLine();
                        Console.Clear();
                        Console.WriteLine("You are ordering from the " + result.City + " store.\n");

                        if (answer.Length == 0 || answer[0] == '0')
                        {
                            break;
                        }

                        int i = 0;
                        while ((i < answer.Length) && (i < toppings_arraylen))
                        {
                            if (Char.IsDigit(answer[i]))
                            {
                                switch (answer[i])
                                {
                                case '1':
                                    Tracker.toppings[i] = "VEGGIES/FRUIT";
                                    Tracker.cost       += Tracker.amt * 0.50m;
                                    break;

                                case '2':
                                    Tracker.toppings[i] = "PEPPERONI";
                                    Tracker.cost       += Tracker.amt * 1.00m;
                                    break;

                                case '3':
                                    Tracker.toppings[i] = "CHICKEN";
                                    Tracker.cost       += Tracker.amt * 1.00m;
                                    break;

                                case '4':
                                    Tracker.toppings[i] = "MEATBALLS";
                                    Tracker.cost       += Tracker.amt * 3.00m;
                                    break;

                                default:
                                    CLError(answer);
                                    break;
                                }

                                if (Tracker.toppings[i].Length == 0)
                                {
                                    break;
                                }
                            }
                            else
                            {
                                CLError(answer);
                                break;
                            }

                            i++;
                        }

                        if (Tracker.toppings[toppings_arraylen - 1].Length > 0)
                        {
                            break;
                        }
                    } while (trials > 0);
                    if (trials < 1)
                    {
                        return;
                    }
                }

                if (pizzas < 100)
                {
                    //CALCULATE CURRENT COST & SAVE STATE OF VARS for PRINTOUT
                    Console.WriteLine("Should I mark this order as complete?");
                    Console.Write("Enter Y/N: ");
                    answer = Console.ReadLine();
                    Console.Clear();
                    switch (answer.ToLower())
                    {
                    case "n":
                    case "no":
                    case "not yet":
                    case "nope":
                        Console.WriteLine("Wow, this must be some good pizza!");
                        another = true;
                        break;

                    case "y":
                    case "yes":
                    case "sure":
                    case "ok":
                    case "k":
                    case "okay":
                    case "alright":
                        break;

                    default:
                        Console.Write("I'll take that as a yes. One moment please ");
                        Loading('.', 3, 2);
                        break;
                    }
                }

                total_cost += Tracker.cost;
                Q.Add(Tracker);

                if (total_cost > 250.00m)
                {
                    Console.Clear();
                    trials = 3;
                    do
                    {
                        Console.WriteLine("Orders can not exceed $250.");
                        Console.WriteLine("Choose which items you would like to remove:\n");

                        for (int i = 0; i < Q.Count; i++)
                        {
                            if (Q[i].preset)
                            {
                                Console.WriteLine(i + 1 + ": (" + Q[i].amt + ") " + Q[i].size + ", " + Q[i].crust + " " + Q[i].preset_order);
                            }
                            else
                            {
                                Console.WriteLine(i + 1 + ": (" + Q[i].amt + ") " + Q[i].size + ", " + Q[i].crust + " " + Q[i].cheese + " on " + Q[i].sauce);
                                Console.Write("Toppings: ");
                                for (int j = 0; j < Q[i].toppings.Length; j++)
                                {
                                    Console.Write(Q[i].toppings[j]);

                                    if (j < Q[i].toppings.Length - 1)
                                    {
                                        Console.Write(", ");
                                    }
                                }
                                Console.WriteLine();
                            }
                            Console.WriteLine("$" + Tracker.cost + "\n");
                        }

                        Console.WriteLine("Total: $" + total_cost);
                        Console.Write("Remove (Enter Digit): ");
                        answer = Console.ReadLine();
                        Console.Clear();
                        if (int.TryParse(answer, out int num) && num > 0 && num <= Q.Count)
                        {
                            total_cost -= Q[num - 1].cost;
                            Q.RemoveAt(num - 1);
                        }
                        else
                        {
                            if (trials > 1)
                            {
                                Console.WriteLine("Please enter a valid digit according to the list below:");
                            }
                            else
                            {
                                Console.WriteLine("Sorry, we tend to think inside the box.\nYou can always contact us directly at 7499274992 (PIZZAPIZZA).\n");
                                Exit();
                                return;
                            }

                            trials--;
                        }
                    } while (total_cost > 250.00m);

                    if (total_cost == 0.00m)
                    {
                        another = true;
                    }
                }
            } while (another);

            if (promo)
            {
                sales_price = total_cost * 0.50m;     //try not to hardcode this for next update (KeyValues<discounts,bools>)
            }
            //PRINT EACH FROM THE QUEUE
            ComputeOrder(Tracker, Q, total_cost);

            if (p_sequence.Length < 1)
            {
                p_sequence = "-";
            }
            else if (c_sequence.Length < 1)
            {
                c_sequence = "-";
            }

            //STORE IN DB
            pizzaboxRepository.AddOrder(MyOrder, ODetails, p_sequence, c_sequence);
            pizzaboxRepository.UpdateInventory(MyOrder.StoreId, preset_amt, custom_amt, "subtract");
        }