public Order SaveCustomerOrder(Order order)
 {
     return OrderProvider.GetInstance(_connectionString).SaveOrder(order);
 }
        public Order SaveOrder(Order order)
        {
            using (var session = Provider.CreateSessionFactory().CreateSession())
            {
                var tranx = session.GetTransaction();

                try
                {
                    var savedOrder = order.ID == 0 ? session.Insert<CsOrder>(order) : session.Update<CsOrder>(order);
                    if (savedOrder == null)
                    {
                        tranx.Rollback();
                        return null;
                    }
                    order.ID = savedOrder.ID;
                    for (int index = 0; index < order.OrderDetails.Count; index++)
                    {
                        var detail = order.OrderDetails[index];
                        detail.OrderID = savedOrder.ID;
                        CsOrderDetail savedOrderDetail = detail.ID == 0
                                                             ? session.Insert(detail)
                                                             : session.Update(detail);
                        if (savedOrderDetail == null)
                        {
                            tranx.Rollback();
                            return null;
                        }

                        order.OrderDetails[index] = savedOrderDetail;
                    }
                    tranx.Commit();
                }
                catch
                {
                    tranx.Rollback();
                    throw;
                }
            }
            return order;
        }
        public List<Order> GetOrdersToDays(DateTime startDate, DateTime endDate)
        {
            using (var session = Provider.CreateSessionFactory().CreateSession())
            {
                //var queryOrders = session.CreateQuery<CsOrder>(" WHERE [OrderDate] > '" + startDate + "' AND [OrderDate] < '" + endDate.AddDays(1) +
                //                                                "' ORDER BY [OrderDate] DESC" + " "
                //                                               );
                string startDateStr = startDate.ToString("yyyy-MM-dd HH:mm:ss");
                string endDateStr= endDate.ToString("yyyy-MM-dd HH:mm:ss");
                var queryOrders = session.CreateQuery<CsOrder>(" WHERE [OrderDate] BETWEEN CONVERT(DateTime,'" + startDateStr + "',120) AND CONVERT(DateTime,'" + endDateStr + "',120) ORDER BY [OrderDate] DESC");

                var orders = queryOrders.GetResults<CsOrder>();
                var fullOrderList = new List<Order>();
                foreach (var order in orders)
                {
                    var fullOrder = new Order
                    {
                        ID = order.ID,
                        AddressId = order.AddressId,
                        AmountDue = order.AmountDue,
                        AmountReceived = order.AmountReceived,
                        AnyReason = order.AnyReason,
                        CustomerID = order.CustomerID,
                        DeliveryCharges = order.DeliveryCharges,
                        Discount = order.Discount,
                        DiscountType = order.DiscountType,
                        IsEdited = order.IsEdited,
                        ShopPostCode = order.ShopPostCode,
                        SpecialInstructions = order.SpecialInstructions,
                        PayStatus = order.PayStatus,
                        PaymentCharges = order.PaymentCharges,
                        PaymentType = order.PaymentType,
                        VoucherCode = order.VoucherCode,
                        TotalAmount = order.TotalAmount,
                        ProcessingTime = order.ProcessingTime,
                        OrderType = order.OrderType,
                        OrderStatus = order.OrderStatus,
                        OrderDate = order.OrderDate,
                        ExpectedTime = order.ExpectedTime
                    };

                    var query = session.CreateQuery<CsOrderDetail>(" WHERE [OrderID] = " + order.ID + " ORDER BY [MenuItemName]");
                    var results = query.GetResults<CsOrderDetail>();
                    if (results != null)
                        fullOrder.OrderDetails = results.ToList();

                    query = session.CreateQuery<CsCustomerAddress>("WHERE [Address_Id] = @AddressID");
                    query.AddParameter("@AddressID", order.AddressId, DbType.Int32);
                    var address = query.GetSingleResult<CsCustomerAddress>();
                    if (address != null)
                    {
                        fullOrder.CustomerAddress = address;
                    }

                    fullOrderList.Add(fullOrder);
                }

                return fullOrderList;
            }
        }
        public List<Order> GetOrdersRecentlyDays(int days, bool inclCustomerInfo)
        {
            using (var session = Provider.CreateSessionFactory().CreateSession())
            {
                var queryOrders = session.CreateQuery<CsOrder>(" WHERE DATEDIFF(DAY,[OrderDate],GETDATE())<" + days + " " +
                                                                " ORDER BY [OrderDate] DESC" + " "
                                                               );

                var ordersInWeek = queryOrders.GetResults<CsOrder>();
                var fullOrderList = new List<Order>();
                foreach (var order in ordersInWeek)
                {
                    var fullOrder = new Order
                    {
                        ID = order.ID,
                        AddressId = order.AddressId,
                        AmountDue = order.AmountDue,
                        AmountReceived = order.AmountReceived,
                        AnyReason = order.AnyReason,
                        CustomerID = order.CustomerID,
                        DeliveryCharges = order.DeliveryCharges,
                        Discount = order.Discount,
                        DiscountType = order.DiscountType,
                        IsEdited = order.IsEdited,
                        ShopPostCode = order.ShopPostCode,
                        SpecialInstructions = order.SpecialInstructions,
                        PayStatus = order.PayStatus,
                        PaymentCharges = order.PaymentCharges,
                        PaymentType = order.PaymentType,
                        VoucherCode = order.VoucherCode,
                        TotalAmount = order.TotalAmount,
                        ProcessingTime = order.ProcessingTime,
                        OrderType = order.OrderType,
                        OrderStatus = order.OrderStatus,
                        OrderDate = order.OrderDate,
                        ExpectedTime = order.ExpectedTime
                    };
                    var query = session.CreateQuery<CsOrderDetail>(" WHERE [OrderID] = " + order.ID + " ORDER BY [MenuItemName]");
                    var results = query.GetResults<CsOrderDetail>();
                    if (results != null)
                        fullOrder.OrderDetails = results.ToList();

                    if (inclCustomerInfo)
                    {
                        query = session.CreateQuery<CsCustomer>(" WHERE [Customer_Id] = @CustomerId");
                        query.AddParameter("@CustomerId",order.CustomerID,DbType.Int32);
                        var customer = query.GetSingleResult<CsCustomer>();
                        fullOrder.Customer = customer;

                        query = session.CreateQuery<CsCustomerAddress>(" WHERE [Address_Id] = @AddressId");
                        query.AddParameter("@AddressId", order.AddressId, DbType.Int32);
                        var customerAddress = query.GetSingleResult<CsCustomerAddress>();
                        fullOrder.CustomerAddress = customerAddress;
                    }

                    fullOrderList.Add(fullOrder);
                }

                return fullOrderList;
            }
        }
        public List<Order> GetOrdersInWeek(int customerId)
        {
            using (var session = Provider.CreateSessionFactory().CreateSession())
            {
                var queryOrders = session.CreateQuery<CsOrder>(" WHERE [OrderType]<>'DELIVERED' " +
                                                                    "AND [OrderType]<>'WAITING_PAYMENT' " +
                                                                    "AND DATEDIFF(DAY,[OrderDate],GETDATE())<5 " +
                                                                    "AND [CustomerID]= " + customerId + " " +
                                                                " ORDER BY [OrderDate] DESC" + " "
                                                               );

                var ordersInWeek = queryOrders.GetResults<CsOrder>();
                var fullOrderList = new List<Order>();
                foreach (var order in ordersInWeek)
                {
                    var fullOrder = new Order
                    {
                        ID = order.ID,
                        AddressId = order.AddressId,
                        AmountDue = order.AmountDue,
                        AmountReceived = order.AmountReceived,
                        AnyReason = order.AnyReason,
                        CustomerID = order.CustomerID,
                        DeliveryCharges = order.DeliveryCharges,
                        Discount = order.Discount,
                        DiscountType = order.DiscountType,
                        IsEdited = order.IsEdited,
                        ShopPostCode = order.ShopPostCode,
                        SpecialInstructions = order.SpecialInstructions,
                        PayStatus = order.PayStatus,
                        PaymentCharges = order.PaymentCharges,
                        PaymentType = order.PaymentType,
                        VoucherCode = order.VoucherCode,
                        TotalAmount = order.TotalAmount,
                        ProcessingTime = order.ProcessingTime,
                        OrderType = order.OrderType,
                        OrderStatus = order.OrderStatus,
                        OrderDate = order.OrderDate,
                        ExpectedTime = order.ExpectedTime
                    };
                    var query = session.CreateQuery<CsOrderDetail>(" WHERE [OrderID] = " + order.ID + " ORDER BY [MenuItemName]");
                    var results = query.GetResults<CsOrderDetail>();
                    if (results != null)
                        fullOrder.OrderDetails = results.ToList();

                    fullOrderList.Add(fullOrder);
                }

                return fullOrderList;
            }
        }
        public Order GetOrderByID(decimal orderId)
        {
            using (var session = Provider.CreateSessionFactory().CreateSession())
            {
                var fullOrder = new Order();
                var order = session.Get<CsOrder>(orderId);
                if (order != null)
                {
                    fullOrder = new Order
                                    {
                                        ID = order.ID,
                                        AddressId = order.AddressId,
                                        AmountDue = order.AmountDue,
                                        AmountReceived = order.AmountReceived,
                                        AnyReason = order.AnyReason,
                                        CustomerID = order.CustomerID,
                                        DeliveryCharges = order.DeliveryCharges,
                                        Discount = order.Discount,
                                        DiscountType = order.DiscountType,
                                        IsEdited = order.IsEdited,
                                        ShopPostCode = order.ShopPostCode,
                                        SpecialInstructions = order.SpecialInstructions,
                                        PayStatus = order.PayStatus,
                                        PaymentCharges = order.PaymentCharges,
                                        PaymentType = order.PaymentType,
                                        VoucherCode = order.VoucherCode,
                                        TotalAmount = order.TotalAmount,
                                        ProcessingTime = order.ProcessingTime,
                                        OrderType = order.OrderType,
                                        OrderStatus = order.OrderStatus,
                                        OrderDate = order.OrderDate,
                                        ExpectedTime = order.ExpectedTime
                                    };
                    var query = session.CreateQuery<CsOrderDetail>(" WHERE [OrderID] = " + order.ID + " ORDER BY [MenuItemName]");
                    var results = query.GetResults<CsOrderDetail>();
                    if (results != null)
                        fullOrder.OrderDetails = results.ToList();

                }
                return fullOrder;
            }
        }