/// <summary> /// Executes the sequence. /// </summary> /// <param name="ui">The Floor Manager UI instance</param> /// <param name="output">Output class instance</param> /// <param name="input">Input class instance</param> public void Execute(FlooringOrders ui, Output output, Input input) { string dateInput = string.Empty, customerName = string.Empty, state = string.Empty, productType = string.Empty; int orderNumber = 0; decimal area = 0; Console.Clear(); Console.WriteLine("*** Edit Order **"); //Prompt user to input a date dateInput = input.PromptUser("Please enter the Date of the order (mm/dd/yyyy)"); Manager manager = ManagerFactory.Create(dateInput); Response dateResponse = manager.ValidDate(manager.OrderRepository.OrderDate); //Check if the entered date is a valid entry, if not send an error if (dateResponse.ResponseType == ResponseType.Invalid) { output.SendError("Invalid date input."); return; } //Check if the entered date is later than today's if (!(dateResponse.Date > DateTime.Now.Date)) { output.SendError($"Date must be later than today's date: {DateTime.Today.Date:MM/dd/yyyy}"); return; } Console.Clear(); //Checks if the order repository for the inputted date contains any values if (manager.OrderRepository.Data.Count <= 0) { //If not, then the file should not exist. FileManager.DeleteFile(FileManager.OrdersPath, dateResponse.Date); output.SendTimedMessage("There are no orders to display.", ConsoleColor.Yellow, 1.5d); //Delete the file & return to main menu. ui.State = UIState.Options; output.ShowFooter("Press any key to go back..."); return; } //Show the user the current order data output.DisplayOrderData(manager.OrderRepository.Data, dateResponse.Date); Order order = new Order(); //Prompt the user for an order number until valid while (orderNumber == 0) { //Prompt user for an order number string orderNumberInput = input.PromptUser("Please enter the order number you'd like to edit."); //Check if string can be parsed as numeric value, and set the order number if (!int.TryParse(orderNumberInput, out orderNumber)) { output.SendError("You can only enter numeric values for an order number."); continue; } order = manager.OrderRepository.GetByValue(orderNumber); //Check if an order exists for that order number if (order == null) { output.SendError("No orders found."); orderNumber = 0; } } //Prompt user to change the customer name while (string.IsNullOrEmpty(customerName)) { customerName = input.PromptUser($"Edit current customer name? [{order.CustomerName}]"); //If the user hits enter, the state returns to default if (string.IsNullOrEmpty(customerName)) { break; } //If the name is invalid, set the customer name to default and continue prompt if (!input.ValidName(customerName)) { output.SendError("Invalid customer name. Check special characters."); customerName = string.Empty; } } //Prompt the user to edit the current state until some response is inputted while (string.IsNullOrEmpty(state)) { Console.WriteLine($"Edit current state? [{order.TaxData.State}]" + "\n"); //Compile list of states for user to choose from state = new ChooseStateWorkflow().GetValue(output, input, manager); //If the user hits enter, the state returns to default if (string.IsNullOrEmpty(state)) { state = order.TaxData.State; } } //Prompt the user to edit the current product type until a response while (string.IsNullOrEmpty(productType)) { Console.WriteLine($"Edit current product type? [{order.Product.ProductType}]" + "\n"); //Compile list of product types for user to choose from productType = new ChooseProductWorkflow().GetProduct(output, input, manager); //If the user hits enter, the product type returns to default if (string.IsNullOrEmpty(productType)) { productType = order.Product.ProductType; } } Console.WriteLine($"Edit current area? [{order.Area}]"); //Prompt the user to enter the area in sq ft until conditions are met while (area < 100) { string areaInput = input.PromptUser("Please enter the new area: "); //No input or hit enter - set area to original value if (string.IsNullOrEmpty(areaInput)) { area = order.Area; break; } if (!decimal.TryParse(areaInput, out area)) { output.SendError("Could not parse input as decimal."); continue; } if (area < 0) { output.SendError("Area must be a positive decimal."); continue; } } //Properly set any data that may be invalid string finalCustomerName = string.IsNullOrEmpty(customerName) ? order.CustomerName : customerName; string finalState = string.IsNullOrEmpty(state) ? order.TaxData.State : state; string finalProductType = string.IsNullOrEmpty(productType) ? order.Product.ProductType : productType; decimal finalArea = ((area != order.Area) && (area != 0 && area >= 100)) ? area : order.Area; //Attempt to edit the order & return a response EditOrderResponse response = manager.EditOrder(dateInput, order.OrderNumber, finalCustomerName, finalState, finalProductType, finalArea); ui.State = UIState.Options; //If the response fails, send the error & return to menu if (response.ResponseType == ResponseType.Fail || response.ResponseType == ResponseType.Invalid) { output.SendError(response.Message); return; } Console.Clear(); //Display data, show footer & wait for input to return to menu output.DisplayOrderData(response.NewOrder, response.Date); output.SendTimedMessage("Order edited successfully!", ConsoleColor.Green, 1D); output.ShowFooter("Press any key to continue..."); }
/// <summary> /// Executes the sequence. /// </summary> /// <param name="ui">The Floor Manager UI instance</param> /// <param name="output">Output class instance</param> /// <param name="input">Input class instance</param> public void Execute(FlooringOrders ui, Output output, Input input) { string date = string.Empty, customerName = string.Empty, state = string.Empty, productType = string.Empty; decimal area = 0; Console.Clear(); Console.WriteLine("*** Add an Order ***"); date = input.PromptUser("Enter a date for your order (mm/dd/yyyy):"); if (string.IsNullOrEmpty(date)) { return; } //Create repository manager to open order files from this date Manager manager = ManagerFactory.Create(date); Response dateResponse = manager.ValidDate(manager.OrderRepository.OrderDate); //Check if the entered date is a valid entry, if not send an error if (dateResponse.ResponseType == ResponseType.Invalid) { output.SendError("Invalid date input."); return; } //Check if the date is later than today's if (!(dateResponse.Date > DateTime.Now.Date)) { output.SendError($"Date must be later than today's date: {DateTime.Today.Date:MM/dd/yyyy}"); return; } //Query customer's name while (string.IsNullOrEmpty(customerName)) { customerName = input.PromptUser("Please enter a name for your order:"); if (string.IsNullOrEmpty(customerName)) { continue; } if (!input.ValidName(customerName)) { output.SendError("Invalid customer name. Check special characters."); customerName = string.Empty; } } //Prompt the user for input from list of states, repeat until valid input while (string.IsNullOrEmpty(state)) { state = new ChooseStateWorkflow().GetValue(output, input, manager); } //Prompt the user for input from list of product types, repeat until valid input while (string.IsNullOrEmpty(productType)) { productType = new ChooseProductWorkflow().GetProduct(output, input, manager); } //Prompt the user for input of the area of the order in sq ft., repeat until valid input while (area < 100) { string areaInput = input.PromptUser("Enter the area dimensions for this product:"); if (string.IsNullOrEmpty(areaInput)) { continue; } if (!decimal.TryParse(areaInput, out area)) { output.SendError("Could not parse input as decimal."); continue; } if (area < 0) { output.SendError("Area must be a positive decimal."); continue; } if (area < 100) { output.SendError("Area must have a sq ft of over 100."); continue; } } Console.Clear(); string confirm = string.Empty; //Prompt the user to confirm their order until input is valid. while (string.IsNullOrEmpty(confirm)) { confirm = input.PromptUser("Are you sure you want to add this order? (y/n)"); if (!string.IsNullOrEmpty(confirm) && (!confirm.ToLower().Equals("y") && !confirm.ToLower().Equals("n"))) { confirm = string.Empty; } } //If the user declines, return to the main menu if (confirm.ToLower().Equals("n")) { output.SendTimedMessage("Returning to options.", ConsoleColor.Yellow, 1.0d); ui.State = UIState.Options; return; } //Once all values are properly inputted, attempt to add the order & get a response AddOrderResponse response = manager.AddOrder(customerName, state, productType, area); ui.State = UIState.Options; if (response.ResponseType.Equals(ResponseType.Fail) || response.ResponseType.Equals(ResponseType.Invalid)) { output.SendError(response.Message); return; } Console.Clear(); //Display data & return to main menu output.DisplayOrderData(response.Order, response.Date); output.SendTimedMessage("Order added successfully!", ConsoleColor.Green, 1D); output.ShowFooter("Press any key to continue..."); }