/// <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;
        }
        /// <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 bill from DB.
 /// </summary>
 /// <param name="workflowInstId">The workflow inst id.</param>
 /// <returns></returns>
 public BillData GetBillFromDB(Guid workflowInstId)
 {
     BillItemsTableAdapter bia = new BillItemsTableAdapter();
     var rows = bia.GetDataByWorkflowID(workflowInstId);
     BillData bd = new BillData();
     bd.BillTotal = 0.00M;
     bd.Items = new List<BillItem>();
     foreach (var row in rows)
     {
         BillItem bi = new BillItem();
         bi.ItemName = row.Name;
         bi.ItemPrice = row.Price;
         bi.Person = row.Person;
         bd.Items.Add(bi);
         bd.BillTotal += bi.ItemPrice;
     }
     return bd;
 }