int ValidateInt(string prompt, out bool attemptsExceeded, int maxAttempts = MAXIMUM_ATTEMPTS)
        {
            bool   loop;
            int    output, attempts = 0;
            string userInput;

            attemptsExceeded = false;
            do
            {
                ConsoleUtil.DisplayPromptMessage(prompt);
                userInput = Console.ReadLine();
                loop      = int.TryParse(userInput, out output);

                if (!loop)
                {
                    ConsoleUtil.DisplayReset();
                    attempts++;
                    if (attempts == maxAttempts)
                    {
                        ConsoleUtil.DisplayMessage("Max attempts exceeded! Value set to zero.");
                        output           = 0;
                        attemptsExceeded = true;
                        break;
                    }
                    ConsoleUtil.DisplayMessage("It appears you've entered an incorrect value. You have " + (maxAttempts - attempts) + " attempts(s) left.");
                    continue;
                }
                break;
            }while (!loop || attempts <= maxAttempts);
            return(output);
        }
Exemple #2
0
        /// <summary>
        /// setup the new salesperson object with the initial data
        /// Note: To maintain the pattern of only the Controller changing the data this method should
        ///       return a Salesperson object with the initial data to the controller. For simplicity in
        ///       this demo, the ConsoleView object is allowed to access the Salesperson object's properties.
        /// </summary>
        public Salesperson DisplaySetupAccount()
        {
            Salesperson salesperson = new Salesperson();

            ConsoleUtil.HeaderText = "Account Setup";
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayPromptMessage("Enter your First Name: ");
            salesperson.FirstName = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your Last Name: ");
            salesperson.LastName = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your Account ID: ");
            salesperson.AccountID = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your Starting City: ");
            salesperson.StartingCity = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayReset();
            ConsoleUtil.DisplayMessage("Your account is setup.");

            DisplayContinuePrompt();

            return(salesperson);
        }
        string ValidateString(string prompt, string defaultValue, out bool attemptsExceeded, int maxAttempts = MAXIMUM_ATTEMPTS)
        {
            bool   loop;
            int    attempts = 0;
            string output   = defaultValue;
            string userInput;

            attemptsExceeded = false;
            do
            {
                ConsoleUtil.DisplayPromptMessage(prompt);
                userInput = Console.ReadLine();
                loop      = userInput == "" ? false : true;

                if (!loop)
                {
                    ConsoleUtil.DisplayReset();
                    attempts++;
                    if (attempts == maxAttempts)
                    {
                        ConsoleUtil.DisplayMessage("Max attempts exceeded! Value set to " + defaultValue + ".");
                        attemptsExceeded = true;
                        break;
                    }
                    ConsoleUtil.DisplayMessage("It appears you've entered an incorrect value. You have " + (maxAttempts - attempts) + " attempts(s) left.");
                    continue;
                }
                output = userInput;
                break;
            }while (!loop || attempts <= maxAttempts);
            return(output);
        }
        public Salesperson DisplaySetupAccount()
        {
            Salesperson salesperson = new Salesperson();

            ConsoleUtil.HeaderText = "Account Setup";
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Setup your account now.");
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your first name: ");
            salesperson.FirstName = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your last name: ");
            salesperson.LastName = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your account ID: ");
            salesperson.AccountID = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayMessage("Product Types");
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Your account is setup");

            DisplayContinuePrompt();

            return(salesperson);
        }
        /// <summary>
        /// get the next city to travel to from the user
        /// </summary>
        /// <returns>string City</returns>

        public string DisplayGetNextCity()
        {
            string nextCity = "";

            ConsoleUtil.DisplayPromptMessage("Enter next city: ");
            nextCity = UppercaseFirst(Console.ReadLine());

            return(nextCity);
        }
Exemple #6
0
        public void DisplayProdToBuyandSell(Salesperson salesperson)
        {
            ConsoleUtil.HeaderText = "Choosing another product";
            ConsoleUtil.DisplayReset();
            Product.ProductType oldProduct = new Product.ProductType();

            oldProduct = salesperson.CurrentStock.Type;

            int attempts = 0;

            bool productSelected = false;

            while (MAXIMUM_ATTEMPTS > attempts && !productSelected)
            {
                ConsoleUtil.DisplayMessage("Enter on of the following products to buy and sell: ");
                ConsoleUtil.DisplayPromptMessage(Product.ProductType.Dancing.ToString() +
                                                 " " + Product.ProductType.Furry.ToString() + " " + Product.ProductType.Spotted.ToString() + " : ");
                string ProductType = Console.ReadLine();
                switch (UppercaseFirst(ProductType))
                {
                case "Furry":
                    salesperson.CurrentStock.Type = Product.ProductType.Furry;
                    productSelected = true;
                    break;

                case "Dancing":
                    salesperson.CurrentStock.Type = Product.ProductType.Dancing;
                    productSelected = true;
                    break;

                case "Spotted":
                    salesperson.CurrentStock.Type = Product.ProductType.Spotted;
                    productSelected = true;
                    break;

                default:
                    ConsoleUtil.DisplayMessage("You did not enter one of the Available products");
                    salesperson.CurrentStock.Type = Product.ProductType.None;
                    break;
                }
                attempts++;
            }

            if (oldProduct == salesperson.CurrentStock.Type)
            {
                ConsoleUtil.DisplayMessage("You decided not change the product you were selling");
            }
            else if (oldProduct != salesperson.CurrentStock.Type)
            {
                ConsoleUtil.DisplayMessage("You discard your " + oldProduct.ToString() + " product to make room for " + salesperson.CurrentStock.Type + " product.");
                salesperson.CurrentStock.ResetProductAmount();
            }
            DisplayContinuePrompt();
        }
        /// <summary>
        /// get the next city to travel to from the user
        /// </summary>
        /// <returns>string City</returns>
        public string DisplayGetNextCity()
        {
            string nextCity = "";

            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayPromptMessage("Enter the name of the next city:");
            nextCity = Console.ReadLine();

            return(nextCity);
        }
Exemple #8
0
        /// <summary>
        /// get the next city to travel to from the user
        /// </summary>
        /// <returns>string City</returns>
        public string DisplayGetNextCity()
        {
            ConsoleUtil.HeaderText = "Travel";
            ConsoleUtil.DisplayReset();

            string nextCity = "";

            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayPromptMessage("Enter the name of the next city:");
            nextCity = Console.ReadLine();

            DisplayContinuePrompt();


            return(nextCity);
        }
Exemple #9
0
        /// <summary>
        /// prompts user for new city and returns it as a string
        /// </summary>
        /// <returns></returns>
        public string DisplayGetNextCity()
        {
            string city;

            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayPromptMessage("Enter the city you wish to travel to: ");
            city = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");
            Console.Write("   Travelling to " + city);
            DisplayTriDotTimed();
            Console.CursorVisible = false;
            System.Threading.Thread.Sleep(1000);
            ConsoleUtil.DisplayMessage("You reached " + city + " City.");

            DisplayContinuePrompt();
            return(city);
        }
Exemple #10
0
        /// <summary>
        /// prompys user for all sales person information and returns a Salesperson object
        /// </summary>
        /// <returns></returns>


        public Salesperson DisplaySetupAccount()
        {
            Salesperson salesperson = new Salesperson();
            int         age         = 18;

            salesperson.Age = age;


            ConsoleUtil.HeaderText = "Account Setup";
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Setup your account now.");
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("First Name: ");
            salesperson.FirstName = Console.ReadLine();

            ConsoleUtil.DisplayPromptMessage("Last Name: ");
            salesperson.LastName = Console.ReadLine();

            ConsoleUtil.DisplayPromptMessage("Age: ");
            salesperson.Age = MenuHandler.IntValidation("Age");


            ConsoleUtil.DisplayPromptMessage("Enter your account ID: ");
            salesperson.AccountID = Console.ReadLine();

            salesperson.Gender = MenuHandler.ChoiceSelectionCursor("Are you a Boy, Or a Girl?", "Boy", "Girl");


            ConsoleUtil.DisplayPromptMessage("Enter your starting City: ");
            salesperson.CitiesVisited.Add(Console.ReadLine());

            salesperson.CurrentStock.Type = Product.ProductType.Spotted;
            ConsoleUtil.DisplayMessage("You start off selling spotted product");

            DisplayContinuePrompt();


            ConsoleUtil.DisplayReset();
            return(salesperson);
        }
        public Product.ProductType ListProducts(List <Product> products)
        {
            int selection = 0;

            while (true)
            {
                ConsoleUtil.DisplayMessage("Product Types:");
                ConsoleUtil.DisplayMessage("");

                //
                // list all product types
                //
                for (int i = 0; i < products.Count; i++)
                {
                    Console.WriteLine("\t " + (i + 1) + ". " + UnderscoreToSpace(products[i].Type.ToString()) + " x" + products[i].NumberOfUnits.ToString());
                }

                //
                // get product type, if invalid entry ask user to choose again.
                //
                ConsoleUtil.DisplayMessage("");
                ConsoleUtil.DisplayPromptMessage("Select a product type. (1 - " + products.Count + ") ");
                ConsoleUtil.DisplayMessage("");

                ConsoleKeyInfo userResponse = Console.ReadKey(true);

                int.TryParse(userResponse.KeyChar.ToString(), out selection);
                if (selection <= products.Count && selection > 0)
                {
                    break;
                }

                ConsoleUtil.DisplayReset();

                ConsoleUtil.DisplayMessage(
                    "It appears you have selected an incorrect choice." + Environment.NewLine +
                    "Press any key to continue or the ESC key to quit the application.");
            }
            return(products[selection - 1].Type);
        }
        public void DisplayUpdateAccount(Salesperson salesperson)
        {
            string userResponce = "";

            ConsoleUtil.HeaderText = "Update Setup";
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Your First Name is: " + salesperson.FirstName);
            ConsoleUtil.DisplayMessage("");
            ConsoleUtil.DisplayPromptMessage("Press enter to continue or input a new First Name:");
            userResponce = Console.ReadLine();
            if (userResponce != "")
            {
                salesperson.FirstName = userResponce;
            }
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Your Last Name is: " + salesperson.LastName);
            ConsoleUtil.DisplayMessage("");
            ConsoleUtil.DisplayPromptMessage("Press enter to continue or input a new Last Name:");
            userResponce = Console.ReadLine();
            if (userResponce != "")
            {
                salesperson.LastName = userResponce;
            }
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Your Account ID is: " + salesperson.AccountID);
            ConsoleUtil.DisplayMessage("");
            ConsoleUtil.DisplayPromptMessage("Press enter to continue or input a new Account ID:");
            userResponce = Console.ReadLine();
            if (userResponce != "")
            {
                salesperson.AccountID = userResponce;
            }
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Your account has been updated!");
            DisplayContinuePrompt();
        }
Exemple #13
0
        /// <summary>
        /// setup the new salesperson object with the initial data
        /// Note: To maintain the pattern of only the Controller changing the data this method should
        ///       return a Salesperson object with the initial data to the controller. For simplicity in
        ///       this demo, the ConsoleView object is allowed to access the Salesperson object's properties.
        /// </summary>
        public Salesperson DisplaySetupAccount()
        {
            Salesperson salesperson = new Salesperson();

            //
            // clear the console for account setup
            //
            ConsoleUtil.HeaderText = "Account Setup";
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayPromptMessage("First Name: ");
            salesperson.FirstName = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Last Name: ");
            salesperson.LastName = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Account ID: ");
            salesperson.AccountID = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Starting city: ");
            string startingCity = Console.ReadLine();

            ConsoleUtil.DisplayMessage("");
            //salesperson.CitiesVisited.Add(Console.ReadLine());

            //
            // add starting city to cities visted
            //
            salesperson.CitiesVisited.Add(startingCity);

            ConsoleUtil.DisplayMessage("");
            ConsoleUtil.DisplayReset();

            return(salesperson);
        }
        /// <summary>
        /// setup the new salesperson object with the initial data
        /// Note: To maintain the pattern of only the Controller changing the data this method should
        ///       return a Salesperson object with the initial data to the controller. For simplicity in
        ///       this demo, the ConsoleView object is allowed to access the Salesperson object's properties.
        /// </summary>

        public Salesperson DisplaySetupAccount()
        {
            Salesperson _salesperson = new Salesperson();

            ConsoleUtil.HeaderText = "Account Setup";
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayPromptMessage("First Name: ");
            _salesperson.FirstName = UppercaseFirst(Console.ReadLine());
            ConsoleUtil.DisplayPromptMessage("Last Name: ");
            _salesperson.LastName = UppercaseFirst(Console.ReadLine());
            ConsoleUtil.DisplayPromptMessage("Account ID: ");
            _salesperson.AccountID = Console.ReadLine();
            if (!ConsoleValidator.TryGetIntegerFromUser(18, 100, 3, "Age", out int userInteger))
            {
                Console.WriteLine("Looks like you are having trouble with your age. Clearly you are old as dirt, setting age to 100.");
                _salesperson.Age = 100;
            }
            _salesperson.Age = userInteger;
            string userResponse = ConsoleValidator.GetYesNoFromUser(3, "Are you a hockey fan?", out bool maxAttemptsExceeded);

            if (maxAttemptsExceeded)
            {
                Console.WriteLine("Not valid answer. You must not be a hockey fan.");
            }
            if (userResponse == "yes")
            {
                _salesperson.IsHockeyFan = true;
            }
            else
            {
                _salesperson.IsHockeyFan = false;
            }

            ConsoleUtil.DisplayMessage("Product Types");
            ConsoleUtil.DisplayMessage("");

            //
            // list all product types
            //
            foreach (string productTypeName in Enum.GetNames(typeof(Product.ProductType)))
            {
                //
                // do not display the "NONE" enum value
                //
                if (productTypeName != Product.ProductType.None.ToString())
                {
                    ConsoleUtil.DisplayMessage(productTypeName);
                }
            }

            //
            // get product type, if invalid entry, set type to "None"
            //
            ConsoleUtil.DisplayMessage("");
            ConsoleUtil.DisplayPromptMessage("Enter the product type: ");
            Product.ProductType productType;
            if (Enum.TryParse <Product.ProductType>(UppercaseFirst(Console.ReadLine()), out productType))
            {
                _salesperson.Inventory.Type = productType;
            }
            else
            {
                _salesperson.Inventory.Type = Product.ProductType.None;
            }


            if (ConsoleValidator.TryGetIntegerFromUser(0, 100, 3, "units", out int numberOfUnits))
            {
                _salesperson.Inventory.AddProducts(numberOfUnits);
            }
            else
            {
                ConsoleUtil.DisplayMessage("You did not enter a valid number of units.");
                ConsoleUtil.DisplayMessage("We will set your intentory to 0");
            }

            _salesperson.Inventory.NumberOfUnits = numberOfUnits;

            ConsoleUtil.DisplayReset();
            ConsoleUtil.DisplayMessage("Your account is now setup");

            return(_salesperson);
        }
        public void DisplayAddInventory(Salesperson salesperson)
        {
            Product.ProductType productType;
            string errorMes = "It appears you have selected an incorrect choice.";

            ConsoleUtil.HeaderText = "Add Inventory";
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Select the product you'd like to add.");
            ConsoleUtil.DisplayMessage("");
            while (true)
            {
                ConsoleUtil.DisplayMessage("Product Types:");
                ConsoleUtil.DisplayMessage("");

                //
                // list all product types
                //
                for (int i = 1; i < Enum.GetNames(typeof(Product.ProductType)).Length; i++)
                {
                    Console.WriteLine("\t " + i + ". " + UnderscoreToSpace(Enum.GetName(typeof(Product.ProductType), i)));
                }

                //
                // get product type, if invalid entry ask user to choose again.
                //
                ConsoleUtil.DisplayMessage("");
                ConsoleUtil.DisplayPromptMessage("Select a product type. (1 - " + (Enum.GetNames(typeof(Product.ProductType)).Length - 1) + "): ");

                ConsoleKeyInfo userResponse = Console.ReadKey(true);
                ConsoleUtil.DisplayMessage("");

                if (Enum.TryParse <Product.ProductType>(userResponse.KeyChar.ToString(), out productType))
                {
                    if (salesperson.CurrentStock.Exists(x => x.Type == productType))
                    {
                        errorMes = UnderscoreToSpace(productType.ToString()) + " is already in your inventory try a different item.";
                    }
                    else
                    {
                        ConsoleUtil.DisplayMessage("You've selected " + UnderscoreToSpace(productType.ToString()) + ".");
                        break;
                    }
                }

                ConsoleUtil.DisplayReset();

                ConsoleUtil.DisplayMessage(
                    errorMes + Environment.NewLine +
                    "Press any key to continue or the ESC key to quit the application.");
            }
            ConsoleUtil.DisplayMessage("");

            //
            // get number of products in inventory
            //
            if (ConsoleValidator.TryGetIntegerFromUser(MINIMUM_BUYSELL_AMOUNT, MAXIMUM_BUYSELL_AMOUNT, MAXIMUM_ATTEMPTS, "products", out int numberOfUnits))
            {
                salesperson.CurrentStock.Add(new Product(productType, numberOfUnits, false));
            }
            else
            {
                ConsoleUtil.DisplayMessage("It appears you are having difficulty setting the number of products in your stock.");
                ConsoleUtil.DisplayMessage("By default, the number of products in your inventory are now set to zero.");
                salesperson.CurrentStock.Add(new Product(productType, 0, false));
            }
            salesperson.Logs.Push(DateTime.Now + " ... " + numberOfUnits + " " + productType + " added to inventory!");
        }
        /// <summary>
        /// setup the new salesperson object with the initial data
        /// Note: To maintain the pattern of only the Controller changing the data this method should
        ///       return a Salesperson object with the initial data to the controller. For simplicity in
        ///       this demo, the ConsoleView object is allowed to access the Salesperson object's properties.
        /// </summary>
        public Salesperson DisplaySetupAccount()
        {
            Salesperson salesperson = new Salesperson();

            ConsoleUtil.HeaderText = "Account Setup";
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Setup your account now.");
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your first name: ");
            salesperson.FirstName = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your last name: ");
            salesperson.LastName = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your account ID: ");
            salesperson.AccountID = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayMessage("Product Types: ");
            ConsoleUtil.DisplayMessage("");

            // list all types of products available
            // Enum.GetNames retrieves an array of the names in ProductType
            foreach (string productName in Enum.GetNames(typeof(Product.ProductType)))
            {
                // do not display "None" product type
                if (productName != "None")
                {
                    ConsoleUtil.DisplayMessage(productName);
                }
            }

            // get product type from user, if input is invalid: product type will be set to "None"
            ConsoleUtil.DisplayMessage("");
            ConsoleUtil.DisplayPromptMessage("Enter product: ");

            // new variable for product type
            //Product.ProductType productType;
            if (Enum.TryParse <Product.ProductType>(UppercaseFirst(Console.ReadLine()), out Product.ProductType productType))
            {
                // set type of current stock to selected product type
                salesperson.CurrentStock.Type = productType;
            }
            else
            {
                // sets type of current stock to "none" product type
                salesperson.CurrentStock.Type = Product.ProductType.None;
            }

            // get number of products
            if (ConsoleValidator.TryGetIntegerFromUser(MINIMUM_BUYSELL_AMOUNT, MAXIMUM_BUYSELL_AMOUNT, MAXIMUM_ATTEMPTS, "products", out int numberOfUnits))
            {
                // add products to current stock
                salesperson.CurrentStock.AddProducts(numberOfUnits);
            }
            else
            {
                ConsoleUtil.DisplayMessage("It appears you are having difficulty setting the number of products in your stock.");
                ConsoleUtil.DisplayMessage("By default, the number of products in your inventory are now set to 0.");
                salesperson.CurrentStock.AddProducts(0);
                DisplayContinuePrompt();
            }

            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Your account is setup");
            ConsoleUtil.DisplayMessage(numberOfUnits + " units of " + productType + " have been added to your inventory.");

            DisplayContinuePrompt();

            return(salesperson);
        }
        /// <summary>
        /// helper method to get a valid integer from the user within a range
        /// </summary>
        /// <param name="minValue">inclusive minimum value</param>
        /// <param name="maxValue">inclusive maximum value</param>
        /// <param name="maxAttempts">maximum number of attempts</param>
        /// <param name="pluralName">plural name of item</param>
        /// <param name="validInput">indicates valid user input</param>
        /// <returns></returns>
        public static bool TryGetIntegerFromUser(int minValue, int maxValue, int maxAttempts, string pluralName, out int userInteger)
        {
            bool   validInput          = false;
            bool   maxAttemptsExceeded = false;
            string userResponse;
            string feedbackMessage = "";
            int    attempts        = 1;

            userInteger = 0;

            while (!validInput && !maxAttemptsExceeded)
            {
                //
                // more attempts available
                //
                if (attempts <= maxAttempts)
                {
                    ConsoleUtil.DisplayPromptMessage($"Enter the number, between {minValue} and {maxValue}, of {pluralName}:");
                    userResponse = Console.ReadLine();
                    ConsoleUtil.DisplayMessage("");

                    //
                    // input is an Integer
                    //
                    if (int.TryParse(userResponse, out userInteger))
                    {
                        //
                        // input is in range
                        //
                        if (userInteger >= minValue && userInteger <= maxValue)
                        {
                            validInput = true;
                        }
                        //
                        // input is not in range
                        //
                        else
                        {
                            feedbackMessage = $"The number {userInteger} is not in the specified range.";
                        }
                    }
                    //
                    // input is not an Integer
                    //
                    else
                    {
                        feedbackMessage = $"{userResponse} is not an integer.";
                    }

                    if (!validInput && attempts <= maxAttempts)
                    {
                        ConsoleUtil.DisplayMessage($"You entered: {userResponse}");
                        ConsoleUtil.DisplayMessage(feedbackMessage);

                        if (attempts < maxAttempts)
                        {
                            ConsoleUtil.DisplayMessage($"Please enter an integer between {minValue} and {maxValue}.");
                            ConsoleUtil.DisplayMessage("Press any key to try again.");
                            Console.ReadKey();
                        }
                        else
                        {
                            ConsoleUtil.DisplayMessage("It appears you have exceeded the maximum number of attempts allowed.");
                            ConsoleUtil.DisplayMessage("Press any key to continue.");
                            Console.ReadKey();
                        }

                        Console.Clear();
                    }
                    else
                    {
                        ConsoleUtil.DisplayMessage("");
                    }

                    attempts++;
                }
                else
                {
                    maxAttemptsExceeded = true;
                }
            }

            return(validInput);
        }
        /// <summary>
        /// setup the new salesperson object with the initial data
        /// Note: To maintain the pattern of only the Controller changing the data this method should
        ///       return a Salesperson object with the initial data to the controller. For simplicity in
        ///       this demo, the ConsoleView object is allowed to access the Salesperson object's properties.
        /// </summary>
        public Salesperson DisplaySetupAccount()
        {
            Salesperson salesperson = new Salesperson();

            ConsoleUtil.HeaderText = "Account Setup";
            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Setup your account now.");
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your first name: ");
            salesperson.FirstName = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your last name: ");
            salesperson.LastName = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayPromptMessage("Enter your account ID: ");
            salesperson.AccountID = Console.ReadLine();
            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayMessage("Product Types");
            ConsoleUtil.DisplayMessage("");

            //
            // list all product types
            //
            foreach (string productTypeName in Enum.GetNames(typeof(Product.ProductType)))
            {
                //
                // do not display the "None" enum value
                //
                if (productTypeName != Product.ProductType.None.ToString())
                {
                    ConsoleUtil.DisplayMessage(productTypeName);
                }
            }

            //
            // get product type, if invalid entry, set type to "None"
            //
            ConsoleUtil.DisplayMessage("");
            ConsoleUtil.DisplayPromptMessage("Enter the product type: ");
            Product.ProductType productType;
            if (Enum.TryParse <Product.ProductType>(UppercaseFirst(Console.ReadLine()), out productType))
            {
                salesperson.CurrentStock.Type = productType;
            }
            else
            {
                salesperson.CurrentStock.Type = Product.ProductType.None;
            }

            //
            // get number of products in inventory
            //
            if (ConsoleValidator.TryGetIntegerFromUser(0, 100, 3, "products", out int numberOfUnits))
            {
                salesperson.CurrentStock.AddProducts(numberOfUnits);
            }
            else
            {
                ConsoleUtil.DisplayMessage("It appears you are having difficulty setting the number of products in your stock.");
                ConsoleUtil.DisplayMessage("By default, the number of products in your inventory are now set to zero.");
                salesperson.CurrentStock.AddProducts(0);
                DisplayContinuePrompt();
            }

            ConsoleUtil.DisplayMessage("");

            ConsoleUtil.DisplayReset();

            ConsoleUtil.DisplayMessage("Your account is setup");

            DisplayContinuePrompt();

            return(salesperson);
        }