/// <summary>
 /// Handles the Save Invoice Button being clicked. Checks if items exists in the datagrid.
 /// If no items exist the Invoice will not be saved.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void saveInvoiceButton_Click(object sender, RoutedEventArgs e)
 {
     try
     {
         if (invoiceNumberTextBox.Text == "TBD") //if invoiceNumberTextBox is TBD then the invoice is a new invoice.
         {                                       //and an INSERT INTO statement is required.
             if (dataGridList.Count == 0)
             {
                 noItemsAddedLabel.Visibility = (Visibility)0;
             }
             else
             {
                 mainLogic.AddInvoice(datePicker.SelectedDate.ToString(), totalCost.ToString(), dataGridList); //add invoice to the DB
                 addItemsCanvas.IsEnabled     = false;
                 invoiceNumberTextBox.Text    = "";
                 invoiceSavedLabel.Visibility = (Visibility)0;
                 itemsComboBox.Text           = "";
                 invoiceComboBox.Text         = "";
                 datePicker.Text = "Please select a date";
             }
         }
         else //if invoicenumbertextbox is not TBD then the invoice is one already in the database and
         {    // an UPDATE statement will be required.
             var selectedInvoice = (clsInvoices)invoiceComboBox.SelectedItem;
             mainLogic.UpdateInvoice(selectedInvoice.InvoiceNum, totalCost.ToString(), dataGridList);
             invoiceLookUpCanvas.IsEnabled = true;
             invoiceSavedLabel.Visibility  = (Visibility)0;
             itemsComboBox.Text            = "";
             invoiceComboBox.Text          = "";
             datePicker.Text = "Please select a date";
         }
         dataGridList.Clear();
         invoiceDataGrid.ItemsSource = dataGridList;
         Cost_TextBox.Text           = "";
         Total_TextBox.Text          = "";
     }
     catch (Exception ex)
     {               //this is reflection
         HandleError(MethodInfo.GetCurrentMethod().DeclaringType.Name,
                     MethodInfo.GetCurrentMethod().Name, ex.Message);
     }
 }
        /// <summary>
        /// Handle when the save button is clicked. Saves the invoice if valid
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSaveInvoice_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(invoice.sInvoiceDate))
                {
                    MessageBox.Show("An invoice must have a date before it can be saved.");
                    return;
                }
                else if (string.IsNullOrWhiteSpace(invoice.sTotalCost) || Convert.ToInt32(invoice.sTotalCost) == 0)
                {
                    MessageBox.Show("An invoice must have items before it can be saved.");
                    return;
                }
                bool invoiceSaved;
                if (isNewInvoice)
                {
                    invoiceSaved = sqlProvider.InsertInvoice(invoice);
                    //get the max invoice that was recently saved
                    invoice.sInvoiceNum = sqlProvider.GetMaxInvoiceID();
                    if (string.IsNullOrWhiteSpace(invoice.sInvoiceNum))
                    {
                        throw new Exception("Failed to retrieve the invoice number after saving");
                    }
                    lblInvoiceNum.Content = $"Invoice #{invoice.sInvoiceNum}";
                }
                else
                {
                    invoiceSaved = sqlProvider.UpdateInvoice(invoice);
                }
                if (!invoiceSaved)
                {
                    MessageBox.Show("An error occurred while saving the invoice, changes have not been saved.");
                    return;
                }

                //assume this is the case for instances like new invoices
                bool isOkToSaveItems = true;
                if (!isNewInvoice)
                {
                    isOkToSaveItems = sqlProvider.DeleteInvoiceLineItems(invoice);
                }
                if (!isOkToSaveItems)
                {
                    MessageBox.Show("An error occurred while attempting to reset the line items in the database. Invoice saved, items not.");
                    return;
                }
                bool itemsSaved = sqlProvider.SaveAllLineItems(invoice.sInvoiceNum, lineItems);
                if (itemsSaved)
                {
                    MessageBox.Show("Invoice saved successfully!");
                    isNewInvoice               = false;
                    btnEditInvoice.IsEnabled   = true;
                    btnDeleteInvoice.IsEnabled = true;
                    LockInvoice();
                }
                else
                {
                    MessageBox.Show("An error occurred while attempting to save the line items in the database. Invoice saved, items not. Previous items still saved.");
                }
            }
            catch (Exception ex)
            {
                //This is the top level method so we want to handle the exception
                HandleError(MethodInfo.GetCurrentMethod().DeclaringType.Name,
                            MethodInfo.GetCurrentMethod().Name, ex.Message);
            }
        }