public OrdersApiModel()
 {
     Order = new Order();
     OrderDetail = new OrderDetail();
     Customer = new Customer();
     Orders = new List<OrderInquiry>();
     Shippers = new List<Shipper>();
     OrderDetails = new List<OrderDetails>();
 }
        /// <summary>
        /// Validate Order Detail Line Item
        /// </summary>
        /// <param name="order"></param>
        /// <param name="dataService"></param>
        public void ValidateOrderDetailLineItem(OrderDetail order, IOrdersDataService dataService)
        {
            ordersDataService = dataService;

            InitializeValidationRules(order);

            ValidateGreaterThanZero("Quantity", "Order Quantity");

        }
        /// <summary>
        /// Update Order Detail Line Item
        /// </summary>
        /// <param name="orderDetail"></param>
        public void UpdateOrderDetailLineItem(OrderDetail orderDetail)
        {
            
            OrderDetail order = dbConnection.OrderDetails.SingleOrDefault(o => o.OrderDetailID == orderDetail.OrderDetailID);

            int originalQuantity = order.Quantity;
            
            order.Quantity = orderDetail.Quantity;
            order.DateUpdated = DateTime.Now;     

            Product product = dbConnection.Products.SingleOrDefault(p => p.ProductID == order.ProductID);
            decimal originalAmount = (originalQuantity * product.UnitPrice);
            decimal newAmount = (order.Quantity * product.UnitPrice);
            decimal diff = newAmount - originalAmount;

            Order orderHeader = dbConnection.Orders.Where(o => o.OrderID == orderDetail.OrderID).FirstOrDefault();
            orderHeader.OrderTotal = orderHeader.OrderTotal + diff;

        }
        /// <summary>
        /// Create Order Detail Line Item
        /// </summary>
        /// <param name="orderDetail"></param>
        public void CreateOrderDetailLineItem(OrderDetail orderDetail)
        {

            int count = dbConnection.OrderDetails.Where(o => o.OrderID == orderDetail.OrderID).Count();
            int itemNumber = 0;
            if (count > 0)
            {
                var maxItemNumber = dbConnection.OrderDetails.Where(o => o.OrderID == orderDetail.OrderID).Max(i => (int?)i.LineItemNumber ?? 0);                      
                itemNumber = Convert.ToInt32(maxItemNumber);               
            }

            itemNumber++;

            DateTime orderCreated = DateTime.Now;

            orderDetail.OrderDetailID = Guid.NewGuid();
            orderDetail.LineItemNumber = itemNumber;
            orderDetail.DateCreated = orderCreated;
            orderDetail.DateUpdated = orderCreated;

            dbConnection.OrderDetails.Add(orderDetail);

            decimal orderTotal = 0;

            if (count > 0)
            {
                orderTotal = (from orderDetails in dbConnection.OrderDetails.Where(o => o.OrderID == orderDetail.OrderID)
                              join products in dbConnection.Products on orderDetails.ProductID equals products.ProductID
                              select new { products.UnitPrice, orderDetails.Quantity }).Sum(o => o.Quantity * o.UnitPrice);

            }
           
            Product product = dbConnection.Products.SingleOrDefault(p => p.ProductID == orderDetail.ProductID);
            orderTotal = orderTotal + ( orderDetail.Quantity * product.UnitPrice );                           
          
            Order order = dbConnection.Orders.Where(o => o.OrderID == orderDetail.OrderID).FirstOrDefault();
            order.OrderTotal = orderTotal;
                     
        }
        /// <summary>
        /// Update Order Detail Line Item
        /// </summary>
        /// <param name="orderID"></param>
        /// <param name="orderDetailID"></param>
        /// <param name="quantity"></param>
        /// <param name="transaction"></param>
        /// <returns></returns>
        public OrderDetail UpdateOrderDetailLineItem(long orderID, Guid orderDetailID, int quantity, out TransactionalInformation transaction)
        {

            transaction = new TransactionalInformation();

            OrdersBusinessRules ordersBusinessRules = new OrdersBusinessRules();

            OrderDetail order = new OrderDetail();
                
            order.Quantity = quantity;
            order.OrderDetailID = orderDetailID;
            order.OrderID = orderID;

            try
            {

                ordersDataService.CreateSession();

                ordersBusinessRules.ValidateOrderDetailLineItem(order, ordersDataService);

                if (ordersBusinessRules.ValidationStatus == true)
                {
                    ordersDataService.BeginTransaction();
                    ordersDataService.UpdateOrderDetailLineItem(order);
                    ordersDataService.CommitTransaction(true);
                    transaction.ReturnStatus = true;
                    transaction.ReturnMessage.Add("Order line item successfully updated.");
                }
                else
                {
                    transaction.ReturnStatus = ordersBusinessRules.ValidationStatus;
                    transaction.ReturnMessage = ordersBusinessRules.ValidationMessage;
                    transaction.ValidationErrors = ordersBusinessRules.ValidationErrors;
                }

            }
            catch (Exception ex)
            {
                transaction.ReturnMessage = new List<string>();
                string errorMessage = ex.Message;
                transaction.ReturnStatus = false;
                transaction.ReturnMessage.Add(errorMessage);
            }
            finally
            {
                ordersDataService.CloseSession();
            }

            return order;


        }