public static void Main()
        {
            XmlConfigurator.Configure();

            Invoice invoice = new Invoice(InvoiceType.PrinterError)
            {
                    BillingAddress = new Address
                    {
                        AddressLine1 = "7110 Westhaven Circle",
                        AddressLine2 = "Apt. 304",
                        Contact = new Person
                        {
                            FirstName = "Shawn",
                            LastName = "Hoffman",
                            BirthDate = DateTime.Parse("10/09/1986"),
                            Sex = PersonSex.Male,
                            MiddleName = "P"
                        },
                        City = "Zionsville",
                        State = "IN",
                        Zip = 46077,
                        CountryCode = "USA"
                    }
            };

            invoice.AddPhoneNumber("317-604-0325", PhoneType.Mobile);
            invoice.AddPhoneNumber("765-453-6297", PhoneType.Emergency);
            invoice.AddPhoneNumber("123-456-7890", PhoneType.Fax);

            Logger.Debug(Extensions.SerializeObject(invoice));

            #region Line Items

            LineItem line1 = new LineItem
            {
                Taxable = true,
                LineType = LineType.Job,
                LineChargeType = LineChargeType.Charge,
                Description = "MacBook Pro - w/Features",
                Quantity = 1,
                UnitPrice = 2800M,
                LineDiscount = 0M
            };
            invoice.AddLineItem(line1);

            LineItem line2 = new LineItem
            {
                Taxable = true,
                LineType = LineType.WideFormat,
                LineChargeType = LineChargeType.Charge,
                Description = "External Super Drive",
                Quantity = 1,
                UnitPrice = 70M
            };
            invoice.AddLineItem(line2);

            LineItem line3 = new LineItem
            {
                Taxable = true,
                LineType = LineType.PrintableFinishedGood,
                LineChargeType = LineChargeType.NoCharge,
                Description = "Student Discount / App Card",
                Quantity = 1,
                UnitPrice = 100M,
                LineDiscount = 1
            };
            invoice.AddLineItem(line3);

            LineItem line4 = (LineItem)line3.CloneBasic();
            invoice.AddLineItem(line4);

            #endregion

            #region Invoice Detail Output

            ConsoleText.ConsoleText.WriteLine(String.Format("========= INVOICE DETAILS ========{5}" +
                                                            "= Invoice Number: {0, -15} {5}" +
                                                            "= Line Count: {1, -19} {5}" +
                                                            "= Total: ${2, -23} {5}" +
                                                            "= Subtotal: ${3, -20} {5}" +
                                                            "= TaxTotal: ${4, -20} {5}" +
                                                            "===================================\r\n", invoice.InvoiceNumber,
                                                            invoice.LineCount, invoice.Total, invoice.Subtotal, invoice.Taxtotal,
                                                            "=\r\n"), ConsoleColor.Gray);

            foreach (LineItem lineItem in invoice.LineItems)
            {
                Console.WriteLine(
                    "Line Num: {4} | Qty: {0} | Description: {1} | Unit Price: ${2} | Line Price: ${3}",
                    lineItem.Quantity, lineItem.Description, lineItem.UnitPrice, lineItem.LineTotal,
                    lineItem.LineItemNum);
            }

            #endregion

            // Playing around with selecting random enum values.
            if (invoice.BillingAddress != null)
                invoice.BillingAddress.Contact.RandomState();

            Invoice invoice2 = Extensions.DeserializeObject<Invoice>(Extensions.SerializeObject(invoice));
            invoice2++;

            #region Invoice2 Detail Output

            ConsoleText.ConsoleText.WriteLine(String.Format("========= INVOICE DETAILS ========{5}" +
                                                            "= Invoice Number: {0, -15} {5}" +
                                                            "= Line Count: {1, -19} {5}" +
                                                            "= Total: ${2, -23} {5}" +
                                                            "= Subtotal: ${3, -20} {5}" +
                                                            "= TaxTotal: ${4, -20} {5}" +
                                                            "===================================\r\n", invoice2.InvoiceNumber,
                                                            invoice2.LineCount, invoice2.Total, invoice2.Subtotal, invoice2.Taxtotal,
                                                            "=\r\n"), ConsoleColor.Gray);

            foreach (LineItem lineItem in invoice2.LineItems)
            {
                Console.WriteLine(
                    "Line Num: {4} | Qty: {0} | Description: {1} | Unit Price: ${2} | Line Price: ${3}",
                    lineItem.Quantity, lineItem.Description, lineItem.UnitPrice, lineItem.LineTotal,
                    lineItem.LineItemNum);
            }

            #endregion

            //const int w = 100;
            //const int s = 5;
            //const int t = 1;
            //Func<char, int, string> liner = (name, times) => new string(name, times);
            //Random r = new Random();
            //Array v = Enum.GetValues(typeof(ConsoleColor));

            //for (int j = 0; j < t; j++)
            //{
            //    for (int i = 0; i < w; i++)
            //    {
            //        ConsoleText.ConsoleText.WriteLine(liner('-', i), Rc(r, v));
            //        Thread.Sleep(s);
            //    }
            //    for (int i = 0; i < w; i++)
            //    {
            //        ConsoleText.ConsoleText.WriteLine(liner('-', w - i), Rc(r, v));
            //        Thread.Sleep(s);
            //    }
            //}

            ConsoleText.ConsoleText.WriteObjXml(invoice, ConsoleColor.White);

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();

            Extensions.GetClassObjects(ref invoice);
        }
        public void AddLineItem(LineItem lineItem)
        {
            if (LineItems.Count > 0)
            {
                lineItem.LineItemNum = LineItems.Max(line => line.LineItemNum) + 1;
            }
            else
            {
                lineItem.LineItemNum = 1;
            }
            LineItems.Add(lineItem);

            CalculateLineItemTax();
            CalculateLineItemTotal();

            Logger.Debug(String.Format("Line Item: {0} added to Invoice: {1}", lineItem.LineItemNum, InvoiceNumber));
        }