/// <summary>
        /// Gets the top sellers.
        /// </summary>
        /// <param name="sessionID">The sessionID of the current session</param>
        /// <param name="start">The start date and time </param>
        /// <param name="end">The end date and time</param>
        /// <param name="numberOfItems">The number of items.</param>
        /// <returns></returns>
        public List<ItemSalesSummery> GetTopSellers(string sessionID, DateTime start, DateTime end, int numberOfItems)
        {
            BillItemsTableAdapter bia = new BillItemsTableAdapter();
            CustomerTransactionsTableAdapter cta = new CustomerTransactionsTableAdapter();
            var transactions = cta.GetDataByTimeFrame(start, end);
            List<CRySTALDataConnections.CRySTALDataSet.BillItemsRow> bit = new List<CRySTALDataConnections.CRySTALDataSet.BillItemsRow>();

            foreach (var trans in transactions)
            {
                var billsItems = bia.GetDataByWorkflowID(trans.WorkflowInstID).ToList();
                bit.AddRange(billsItems);
            }

            List<string> itemNames = (from p in bit select p.Name).Distinct().ToList();
            List<ItemSalesSummery> iss = new List<ItemSalesSummery>();
            foreach (string itemName in itemNames)
            {
                ItemSalesSummery sum = new ItemSalesSummery();
                sum.itemName = itemName;
                sum.totalAmountSold = (from p in bit where p.Name == itemName select p).Count();
                sum.cost = (from p in bit where p.Name == itemName select p.Price).FirstOrDefault();
                sum.totalAmount = sum.totalAmountSold * sum.cost;
                iss.Add(sum);
            }
            return (from p in iss orderby p.totalAmountSold descending select p).Take(numberOfItems).ToList();
        }
 /// <summary>
 /// Gets the transactions over a time frame.
 /// </summary>
 /// <param name="sessionID">The sessionID of the current session</param>
 /// <param name="startTime">The start time.</param>
 /// <param name="endTime">The end time.</param>
 /// <returns></returns>
 public List<Transaction> GetTransactions(string sessionID, DateTime startTime, DateTime endTime)
 {
     CustomerTransactionsTableAdapter cta = new CustomerTransactionsTableAdapter();
     var rows = cta.GetDataByTimeFrame(startTime, endTime);
     List<Transaction> re = new List<Transaction>();
     foreach (var row in rows)
     {
         Transaction trans = new Transaction();
         trans.Bill = GetBillFromDB(row.WorkflowInstID);
         trans.AssignedTo = row.AssignedTo;
         trans.StartTime = row.StartTime;
         if (row.IsEndTimeNull()) trans.EndTime = null;
         else
             trans.EndTime = row.EndTime;
         trans.ID = row.Id;
         trans.IsActive = row.IsActive;
         trans.NotPaied = row.NotPaied;
         trans.TableNumber = row.TableNumber;
         trans.WorkflowInstID = row.WorkflowInstID;
         re.Add(trans);
     }
     return re;
 }
        /// <summary>
        /// Gets the statistics.
        /// </summary>
        /// <param name="sessionID">The sessionID of the current session</param>
        /// <param name="stat">The stat.</param>
        /// <param name="typeOfStat">The type of stat.</param>
        /// <param name="productID">The product ID.</param>
        /// <param name="start">The start date and time </param>
        /// <param name="end">The end date and time</param>
        /// <returns></returns>
        public List<double> GetStatistics(string sessionID, StatObject stat, StatType typeOfStat, int productID, DateTime start, DateTime end)
        {
            if (stat == StatObject.Income)
            {
                if (typeOfStat == StatType.ForEachDay)
                {

                    BillItemsTableAdapter bia = new BillItemsTableAdapter();
                    CustomerTransactionsTableAdapter cta = new CustomerTransactionsTableAdapter();
                    var transactions = cta.GetDataByTimeFrame(start, end);
                    int numOfDays = (int)(end.Date.Subtract(start.Date).TotalDays);

                    double[] re = new double[numOfDays+1];
                    foreach (var trans in transactions)
                    {
                        if (!trans.IsEndTimeNull())
                        {
                            int dayVal = (int)(trans.EndTime.Date.Subtract(start.Date).TotalDays);
                            var bills = bia.GetDataByWorkflowID(trans.WorkflowInstID);
                            re[dayVal] += (double)(from p in bills select p.Price).Sum();
                        }
                    }
                    return re.ToList();

                }
            }
            else if (stat == StatObject.PayroleExpence)
            {
                if (typeOfStat == StatType.ForEachDay)
                {
                    WorkerShiftsTableAdapter wta = new WorkerShiftsTableAdapter();
                    var shifts = wta.GetDataByTimeFrame(start, end);
                    int numOfDays = (int)(end.Date.Subtract(start.Date).TotalDays);
                    RolePayrateTableAdapter rta = new RolePayrateTableAdapter();
                    var payoutTable = rta.GetData();
                    List<double> re = new List<double>();

                    DateTime i_start = start.Date;
                    DateTime i_end = i_start.Add(new TimeSpan(1, 0, 0, 0));
                    for (int i = 0; i < numOfDays; i++)
                    {
                        decimal v = (from p in shifts
                                     where p.StartTime > i_start && p.StartTime < i_end &&
                                     p.IsEndTimeNull() == false
                                     select (from q in payoutTable where q.Role == p.Role select q.PayPerHour).FirstOrDefault()
                                     * (decimal)(p.EndTime.Subtract(p.StartTime).TotalHours)).Sum();
                        re.Add((double)v);
                        i_start = i_end;
                        i_end = i_start.Add(new TimeSpan(1, 0, 0, 0));

                    }
                    return re;
                }
            }
            return null;
        }