public Workspace[] GetKPIs(string rolename, string location, string[] locations)
        {
            if (string.IsNullOrEmpty(rolename))
                throw new Exception("No role assigned for user");

            Workspace A = new Workspace {
                    Code = "A",
                    Description = "Operational KPIs"
                };
            Workspace B = new Workspace {
                Code = "B",
                Description = "Truck Cycle KPIs"
            };

            using (System.Data.IDbConnection conn = _dbf.Create())
            {
                conn.Open();

                KPIRole role = RetrieveRole(conn, rolename);
                string[] filterlocations = location.Equals("all", StringComparison.InvariantCultureIgnoreCase)
                    ? locations
                    : new string[] {location};

                using (System.Data.IDbCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandType = System.Data.CommandType.Text;
                    cmd.CommandText = this.SelectKPISQL(filterlocations);
                    Console.Out.WriteLine(cmd.CommandText);
                    using (System.Data.IDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            foreach (KPIDisplay kpi in role.KPIs)
                            {
                                RetrieveKPI(dr, kpi);
                            }
                        }
                    }
                }

                List<Models.KPI> akpis = new List<Models.KPI>();
                List<Models.KPI> bkpis = new List<Models.KPI>();
                foreach (KPIDisplay kpi in role.KPIs)
                {
                    if (kpi.StartTime == null || !kpi.StartTime.HasValue ||
                        kpi.EndTime == null || !kpi.EndTime.HasValue ||
                        (DateTime.Now >= kpi.StartTime.Value &&
                        DateTime.Now < kpi.EndTime.Value))
                    {
                        List<Models.KPI> wkpis = kpi.Display.StartsWith("A") ? akpis : bkpis;
                        wkpis.Add(kpi.KPI);
                    }
                }

                A.KPIs = akpis.ToArray();
                B.KPIs = bkpis.ToArray();
            }

            return new Workspace[] { A, B };
        }
        public Workspace[] GetKPIs(string rolename, string location, string[] locations)
        {
            Workspace A = new Workspace {
                Code = "A",
                Description = "Operational KPIs"
            };
            if (_numkpi > 0)
            {
                A.KPIs = GenerateKPI(location);
            }
            else
            {
                A.KPIs = new CAI.COMMANDoptimize.KPI.Models.KPI[] {
                    new CAI.COMMANDoptimize.KPI.Models.KPI {
                        Code = "005",
                        Description = "Total Compliance",
                        Category = "02",
                        Actual = 181,
                        Units = 230,
                        Target = 207,
                        Level1 = 195.5M,
                        Level2 = 184
                    },
                    new CAI.COMMANDoptimize.KPI.Models.KPI {
                        Code = "006",
                        Description = "Locked Loads",
                        Category = "02",
                        Actual = 22,
                        Units = 228,
                        Target = 11.4M,
                        Level1 = 22.8M,
                        Level2 = 34.2M
                    }
                };
            }

            Workspace B = new Workspace {
                Code = "B",
                Description = "Truck Cycle KPIs"
            };

            if (_numkpi > 0)
            {
                B.KPIs = GenerateKPI(location);
            }
            else
            {
                B.KPIs = new CAI.COMMANDoptimize.KPI.Models.KPI[] {
                    new CAI.COMMANDoptimize.KPI.Models.KPI {
                        Code = "001",
                        Description = "First Load",
                        Category = "01",
                        Actual = 885,
                        Units = 36,
                        Target = 370,
                        Level1 = 740,
                        Level2 = 1110
                    },

                    new CAI.COMMANDoptimize.KPI.Models.KPI {
                        Code = "002",
                        Description = "Job Wait",
                        Category = "01",
                        Actual = 835,
                        Units = 40,
                        Target = 416,
                        Level1 = 624,
                        Level2 = 832
                    },

                    new CAI.COMMANDoptimize.KPI.Models.KPI {
                        Code = "003",
                        Description = "Yard Time",
                        Category = "01",
                        Actual = 860,
                        Units = 40,
                        Target = 600,
                        Level1 = 800,
                        Level2 = 1000
                    }
                };
            }

            return new Workspace[] { A, B };
        }