public void ConfirmDeletion()
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Beep();
            Console.Beep();
            Console.Beep();

            Console.WriteLine("\tARE YOU SURE YOU WANT TO DELETE THIS ORDER?  (Y)es or (N)o");

            string input = Console.ReadLine().ToUpper();

            if (input == "Y")
            {
                OrderOperations ops = new OrderOperations();
                Response response = ops.OrderToDelete(formattedDate, orderNumber);

                if (response.Success)
                {
                    Console.WriteLine(response.Message);

                }
                else
                {
                    Console.WriteLine(response.Message);
                }
            }

            else
            {
                MainMenu mainMenu = new MainMenu();
                mainMenu.Execute();
            }
        }
        public Order DisplayOrderInformation(string file, int orderNumber)
        {
            var ops = new OrderOperations();
            //string formattedDate = GetOrderDateFromUser();
            //int num = GetOrderNumberFromUser();

            var response = ops.GetOrder(file, orderNumber);
            //_currentOrder = response.OrderInfo;
                if (response.Success)
                {
                    _currentOrder = response.OrderInfo;
                    PrintOrderInformation(response.OrderInfo);
                    return _currentOrder;
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("\tError occurred!!");
                    Console.WriteLine(response.Message);
                    Console.WriteLine("\tPress enter to continue...");
                log.ErrorMessage = "That was not a valid order UI:DisplayOrdererInfo....";
                ops.CallingErrorLogRepository(log.ErrorMessage);
                Console.ReadLine();
                    //GetOrderNumberFromUser();//********************
                    return null;
                }
        }
        public string CreateDate()
        {
            DateTime currentDate = DateTime.Now;
            OrderOperations ops = new OrderOperations();

            formattedDate = ops.CheckFileDate(currentDate);
            return formattedDate;
        }
        public void GetOrder_ShouldReturn_True_IfOrderExists()
        {
            //Arrange
            var repo = new TestRepository();
            string fakeDate = @"DataFiles\TestFiles\Orders_01012020.txt";
            OrderOperations ops = new OrderOperations(repo);
            //Act
            Response response = ops.GetOrder(fakeDate, 2);

            //Assert
            Assert.AreEqual(true, response.Success);
        }
        public void MatchState_ShouldReturn_TaxRate()
        {
            //Arrange
            var repo = new TestRepository();
            var errorLogRepository = new FakeErrorLogRepository();
            string fakeDate = @"DataFiles\TestFiles\Orders_01012020.txt";
            OrderOperations ops = new OrderOperations(repo, errorLogRepository);
            //Act
            var taxRate = ops.MatchState("OH");

            //Assert
            Assert.AreEqual(6.25M, taxRate);
        }
        public void GetOrder_ShouldReturn_False_IfOrder_DoesNotExist()
        {
            //Arrange
            var repo = new TestRepository();
            var errorLogRepository = new FakeErrorLogRepository();
            string fakeDate = @"DataFiles\TestFiles\Orders_01012020.txt";
            OrderOperations ops = new OrderOperations(repo, errorLogRepository);
            //Act
            Response response = ops.GetOrder(fakeDate, 5);

            //Assert
            Assert.AreEqual(false, response.Success);
        }
        public void ShouldReturn_AllOrders()
        {
            //Arrange
            var repo = new TestRepository();
            string fakeDate = @"DataFiles\TestFiles\Orders_01012020.txt";
            OrderOperations ops = new OrderOperations(repo);

            //Act

            List<Order> orders = ops.GetAllOrders(fakeDate);
            //Assert

            Assert.AreEqual(orders.Count, 2);
            Assert.AreEqual(orders.Select(o => o.OrderNumber).Contains(1), true);
        }
        public void ChangeProduct()
        {
            OrderOperations ops = new OrderOperations();
            Console.ForegroundColor = ConsoleColor.White;

            Console.Write("\tProduct Type ({0}): ", _currentOrder.ProductType.ToUpper());
            string inputP = Console.ReadLine();
            if (inputP != "")  //want to change product
            {
                _currentOrder.ProductType = inputP;
                _currentOrder.CostSqFt = ops.ReturnCostPerSquareFoot(_currentOrder.ProductType);
            }

            _currentOrder.CostSqFt = ops.ReturnCostPerSquareFoot(_currentOrder.ProductType);
        }
        public int DisplayAllAccounts(string file)
        {
            Console.Clear();
            var ops = new OrderOperations();
            //get all orders from the entered file
            List<Order> allOrdersToDisplay = ops.GetAllOrders(file);
            Console.WriteLine("\t");
            foreach (var a in allOrdersToDisplay)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("\t************************");
                Console.WriteLine("\tOrder Number: {0}", a.OrderNumber);
                Console.WriteLine("\t************************");
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine("\tName: {0}", a.LastName.ToUpper());
                Console.WriteLine("\tState: {0}", a.State.ToUpper());
            }
            do
            {
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine("\n  PLEASE CH0OSE AN ORDER NUMBER....");
                string input = Console.ReadLine();

                int OrderNumber;

                if (int.TryParse(input, out OrderNumber))
                {
                    // is this valid order
                    if (ops.GetOrder(file, OrderNumber).Success)
                    {
                        Console.Clear();
                        return OrderNumber;
                    }
                }
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("\tThat was not a valid entry....");
                log.ErrorMessage = "That was not a valid order number entry UI:DisplayALlAccounts....";
                ops.CallingErrorLogRepository(log.ErrorMessage);
                Console.WriteLine("\tPress enter to continue....");
                Console.ReadLine();

            } while (true);
        }
        public void Execute()
        {
            Console.Clear();
            var mgr = ManagerFactory.CreateProductManagr();
            mgr.ListAllProducts();

            var orderOps = new OrderOperations();

            DisplayAllProducts();
            GetCustomerName();
            GetCustomerState();
            GetProductType();
            GetArea();
            Order orderToAdd = orderOps.NewOrderCalculations(_orderToAdd);
            PrintOrderDetails(orderToAdd);

            Console.ReadLine();
            OrderToConfirm(orderToAdd);

            Console.ReadLine();
        }
        private void DisplayOrderInformation(DateTime orderDate)
        {
            var ops = new OrderOperations();
            var response = ops.GetOrders(orderDate);
            Console.Clear();

            if (response.Success)
            {
                PrintOrderDetails(response.Data, orderDate);

                Console.WriteLine("Press any key to continue...");
                Console.ReadKey();
            }
            else
            {
                Console.WriteLine("A problem occurred...");
                Console.WriteLine(response.Message);
                Console.WriteLine("Press any key to continue...");
                Console.ReadKey();
            }
        }
        //calls CreateOrder and stores a Order in response.
        public void PopulateOrder(string formattedDate)
        {
            OrderOperations ops = new OrderOperations();
            var response = new Response();
            Order order = new Order();
            bool isValid = false;
            decimal stateRate = 0;
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.Clear();
            Console.WriteLine("\tEnter Account Information");
            Console.WriteLine("\t----------------------");
            Console.ForegroundColor = ConsoleColor.White;

            bool checkedInput = true;
            do
            {
                Console.Write("\tLast Name: ");
                order.LastName = Console.ReadLine();
                if (order.LastName.Length <= 0)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("\tThat was not a valid entry.\n\t Please enter a name...");
                    log.ErrorMessage = "That was not a valid name(name) UI:PopulateOrder/AddWorkflow....";
                    ops.CallingErrorLogRepository(log.ErrorMessage);
                    checkedInput = false;
                    continue;
                }

                checkedInput = ops.ValidateInput(order.LastName.ToCharArray());

                if (checkedInput == false)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("\tNo special characters in name are permitted.\n\t Please enter valid name");
                    log.ErrorMessage = "That was not a valid name(name) UI:PopulateOrder/AddWorkflow....";
                    ops.CallingErrorLogRepository(log.ErrorMessage);
                }

                else
                {
                    checkedInput = true;
                }

            } while (checkedInput == false);

            do
            {
                Console.ForegroundColor = ConsoleColor.White;

                Console.Write("\tState: ");
                order.State = Console.ReadLine();
                //string state = order.State;
                if (order.State.Length < 2)
                {
                    Console.WriteLine("\tThat was not a valid entry.\n Please enter a state...");
                    log.ErrorMessage = "That was not a valid entry(state) UI:PopulateOrder/AddWorkflow....";
                    ops.CallingErrorLogRepository(log.ErrorMessage);
                }
                else
                {
                    isValid = true;
                    stateRate = ops.MatchState(order.State);
                    if (stateRate == 0)
                    {
                        isValid = false;
                    }
                }
            } while (!isValid);

            //setting tax rate based on state
            order.TaxRate = stateRate;
            Console.ForegroundColor = ConsoleColor.White;

            Console.WriteLine("\tYour tax rate is {0}: ", order.TaxRate);

            //-------------PRODUCT-----------------------

            Product product = new Product();
            do
            {
                Console.ForegroundColor = ConsoleColor.White;

                //Console.WriteLine("");
                Console.Write("\tPlease enter a product type:\n\t\t Carpet, Laminate, Tile, Wood: ");

                order.ProductType = Console.ReadLine();

                if (order.ProductType.Length > 8 || order.ProductType.Length < 1)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("\tThat was not a valid entry.\n Please enter a product...");
                    log.ErrorMessage = "That was not a valid entry (product) UI:PopulateOrder....";
                    ops.CallingErrorLogRepository(log.ErrorMessage);
                }
                else
                {

                    order.CostSqFt = ops.ReturnCostPerSquareFoot(order.ProductType);

                }
            } while (order.CostSqFt == 0);// is 0

            Console.ForegroundColor = ConsoleColor.White;

            Console.WriteLine("\tYour cost per square foot is {0:c}: ", order.CostSqFt);

            // getting labor per square foot
            order.LaborSqFt = ops.LaborPerSquareFt(order.ProductType);
            Console.ForegroundColor = ConsoleColor.White;

            Console.WriteLine("\tYour labor per square foot is {0:c}: ", order.LaborSqFt);

            // getting area
            do
            {
                Console.ForegroundColor = ConsoleColor.White;

                Console.Write("\tArea: ");
                string input = Console.ReadLine();
                if (input.Length == 0)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("\tThat was not a valid entry.\n\t Please enter a Area...");
                    log.ErrorMessage = "That was not a valid Area(Area) UI:PopulateOrder/AddWorkflow....";
                    ops.CallingErrorLogRepository(log.ErrorMessage);
                    order.Area = 0;
                    continue;
                }

                order.Area = decimal.Parse(input);

                if (order.Area <= 0)
                {
                    Console.WriteLine("\tYou need to get a bigger house!");
                    log.ErrorMessage = "That was not a valid area (area) UI:PopulateOrder....";
                    ops.CallingErrorLogRepository(log.ErrorMessage);

                }
            } while (order.Area <= 0);

            // getting material cost
            order.MaterialCost = ops.MaterialCost(order.ProductType, order.Area);
            Console.ForegroundColor = ConsoleColor.White;

            Console.Write("\tMaterial Cost: {0:c} ", order.MaterialCost);

            //getting labor cost
            Console.ForegroundColor = ConsoleColor.White;

            order.LaborCost = ops.LaborCost(order.ProductType, order.Area);
            Console.Write("\nLabor Cost: {0:c} ", order.LaborCost);

            //get tax
            Console.ForegroundColor = ConsoleColor.White;

            order.Tax = ops.Tax(order.State, order.MaterialCost);
            Console.Write("\nTax: {0:c} ", order.Tax);

            //get total
            Console.ForegroundColor = ConsoleColor.White;

            Console.Write("\nTotal: {0:c}", order.Total);
            order.Total = ops.Total(order.MaterialCost, order.Tax, order.LaborCost);

            Console.WriteLine();

            ops.CreateOrder(order, formattedDate);

            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Yellow;

            Console.WriteLine("\n\tHere is your new order information:  \n");
            DisplayOrderWorkflow dowf = new DisplayOrderWorkflow();
            dowf.PrintOrderInformation(order);
            Console.ForegroundColor = ConsoleColor.White;
        }
 public void ChangeTotal()
 {
     OrderOperations ops = new OrderOperations();
     _currentOrder.Total = ops.Total(_currentOrder.MaterialCost, _currentOrder.Tax, _currentOrder.LaborCost);
 }
        public void ChangeState()
        {
            OrderOperations ops = new OrderOperations();
            Console.ForegroundColor = ConsoleColor.White;

            Console.Write("\tState ({0}): ", _currentOrder.State.ToUpper());
            string inputS = Console.ReadLine();

            if (inputS.Length <= 2)
            {
                if (inputS != "") // want to change state
                {
                    _currentOrder.State = inputS;
                    _currentOrder.TaxRate = ops.MatchState(_currentOrder.State);
                }
            }
            _currentOrder.TaxRate = ops.MatchState(_currentOrder.State);
        }
 public void ChangeMaterialCost()
 {
     OrderOperations ops = new OrderOperations();
     _currentOrder.MaterialCost = ops.MaterialCost(_currentOrder.ProductType, _currentOrder.Area);
 }
 public void ChangeLaborPerSquareFt()
 {
     OrderOperations ops = new OrderOperations();
     _currentOrder.LaborSqFt = ops.LaborPerSquareFt(_currentOrder.ProductType);
 }
 public void ChangeLaborCost()
 {
     OrderOperations ops = new OrderOperations();
     _currentOrder.LaborCost = ops.LaborCost(_currentOrder.ProductType, _currentOrder.Area);
 }
        public Order NewOrder()
        {
            OrderOperations ops = new OrderOperations();
            ////*************************************************************************************

            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Yellow;

            Console.WriteLine("\tHere is your new order information:  ");
            DisplayOrderWorkflow dowf = new DisplayOrderWorkflow();
            Response response = new Response();
            //dowf.DisplayOrderInformation(EditedOrder);
            //Order editedOrder = dowf.DisplayOrderInformation(formattedDate, orderNumber);
            Order newEditedOrder = response.OrderInfo;
            response = ops.EditOrder(formattedDate, orderNumber, _currentOrder);
            dowf.PrintOrderInformation(response.OrderInfo);
            Console.ForegroundColor = ConsoleColor.White;
            return newEditedOrder;
        }
        public void OrderToConfirm(Order orderToAdd)
        {
            var orderOps = new OrderOperations();
            DateTime orderDateToday = DateTime.Today;
            var confirmOrder = "";
            bool validEntry = true;

            do
            {
                Console.WriteLine("Would you like to place this order? Please enter Yes or No.");
                confirmOrder = Console.ReadLine();
                confirmOrder = confirmOrder.Substring(0, 1).ToUpper();
                if (confirmOrder != "Y" && confirmOrder != "N")
                {
                    Console.WriteLine("That is an invalid entry. Please input yes or no.");
                    validEntry = false;
                }
                if (string.IsNullOrEmpty(confirmOrder))
                {
                    Console.WriteLine("You must make a selection. Please input Yes or No.");
                    validEntry = false;
                }
                else
                {
                    validEntry = true;
                }
            } while (!validEntry);

            if (confirmOrder == "Y")
            {
                orderOps.NewOrderNumber(orderToAdd, orderDateToday);
                var response = orderOps.AddNewOrder(orderToAdd, orderDateToday);

                if (response.Success)
                {
                    Console.WriteLine("========| Order Confirmation | ========");
                    Console.WriteLine("Order number: {0}",response.Data.OrderNumber);
                    Console.WriteLine("Product Type: {0}", response.Data.ProductType);
                    Console.WriteLine("Amount Ordered: {0}sqft", response.Data.Area);
                    Console.WriteLine("Material Cost: {0:c}", response.Data.MaterialCost);
                    Console.WriteLine("Labor Cost: {0:c}", response.Data.LaborCost);
                    Console.WriteLine("Tax: {0:c}", response.Data.Tax);
                    Console.WriteLine("Total: {0:c}", response.Data.Total);
                }
            }
            else
            {
                var response = orderOps.AddNewOrder(orderToAdd, orderDateToday);
                Console.WriteLine(response.Message);
            }
        }
 public void ChangeTax()
 {
     OrderOperations ops = new OrderOperations();
     _currentOrder.Tax = ops.Tax(_currentOrder.State, _currentOrder.MaterialCost);
 }