Пример #1
0
 public async Task <UrlCount> TagSearchAsync(string URLs)
 {
     return(await Task.Run(() =>
     {
         int count;
         count = GetTagCount(GetHtml(ref URLs));
         UrlCount URLCount = new UrlCount {
             Url = URLs, Count = count
         };
         return URLCount;
     }));
 }
Пример #2
0
        public ActionResult Index()
        {
            EmployeeListViewModel    employeeListViewModel = new EmployeeListViewModel();
            EmployeeBusinessLayer    empBal        = new EmployeeBusinessLayer();
            List <Employee>          employees     = empBal.GetEmployees();
            List <EmployeeViewModel> empViewModels = new List <EmployeeViewModel>();

            employeeListViewModel.UserName = User.Identity.Name;
            List <AreaModel> areaInfo = new List <AreaModel>();

            areaInfo = empBal.GetAreaInfo();

            var eply = from m in employees
                       select m;

            var email = from m in employees
                        select m.email;

            employeeListViewModel.uniqueUser = email.Distinct().Count();

            //var dateInfo = from m in employees
            //               join region in areaInfo on m.email equals region.Email
            //               where m.event1 == "open"
            //               orderby DateTime.Parse(m.DateInclude).Year.ToString() + "-" + DateTime.Parse(m.DateInclude).Month.ToString() + "-" + DateTime.Parse(m.DateInclude).Day.ToString()
            //               group m by new { date = DateTime.Parse(m.DateInclude).Year.ToString() + "-" + DateTime.Parse(m.DateInclude).Month.ToString() + "-" + DateTime.Parse(m.DateInclude).Day.ToString(), code = region.AreaCode } into grp
            //               select new { key = grp.Key, cnt = grp.Count() };

            var dateInfo = from m in employees
                           where m.event1 == "open"
                           orderby DateTime.Parse(m.DateInclude).Year.ToString() + "-" + DateTime.Parse(m.DateInclude).Month.ToString() + "-" + DateTime.Parse(m.DateInclude).Day.ToString()
                           group m by DateTime.Parse(m.DateInclude).Year.ToString() + "-" + DateTime.Parse(m.DateInclude).Month.ToString() + "-" + DateTime.Parse(m.DateInclude).Day.ToString() into grp
                           select new { key = grp.Key, cnt = grp.Count() };
            List <DateCount> dateCount = new List <DateCount>();

            foreach (var item in dateInfo)
            {
                DateCount date = new DateCount();
                date.date = item.key;

                date.count = item.cnt;
                dateCount.Add(date);
            }
            employeeListViewModel.dateCount = dateCount;



            var clickUser = from m in employees
                            where m.event1 == "click"
                            select m.email;
            int uniqueClickUser = clickUser.Distinct().Count();

            employeeListViewModel.uniqueClickUser = uniqueClickUser;

            var urlInfo = from m in employees
                          where m.url != ""
                          group m by m.url.Split('/')[m.url.Split('/').Count() - 1] into grp
                          orderby grp.Count() descending
                          select new { key = grp.Key, cnt = grp.Count() };
            List <UrlCount> urlCount = new List <UrlCount>();

            foreach (var item in urlInfo)
            {
                UrlCount url = new UrlCount();
                url.url   = item.key;
                url.count = item.cnt;
                urlCount.Add(url);
            }
            employeeListViewModel.urlCount = urlCount;

            var open      = eply.Where(s => s.event1.Equals("open"));
            var click     = eply.Where(s => s.event1.Equals("click"));
            var processed = eply.Where(s => s.event1.Equals("processed"));
            var delivered = eply.Where(s => s.event1.Equals("delivered"));
            var deferred  = eply.Where(s => s.event1.Equals("deferred"));

            employeeListViewModel.openCount      = open.Count();
            employeeListViewModel.clickCount     = click.Count();
            employeeListViewModel.processedCount = processed.Count();
            employeeListViewModel.deliveredCount = delivered.Count();
            employeeListViewModel.deferredCount  = deferred.Count();



            //System.Diagnostics.Debug.WriteLine("here");
            //foreach (var a in areaInfo)
            //{
            //    System.Diagnostics.Debug.WriteLine(a.EmpId);
            //}
            //System.Diagnostics.Debug.WriteLine("here2");

            var regionCode = from m in employees
                             where m.event1 == "open"
                             join code in areaInfo on m.email equals code.Email
                             group code by code.AreaCode into grp
                             select new { code = grp.Key, cnt = grp.Distinct().Count() };
            List <regionCodeCount> regionCodeCount = new List <regionCodeCount>();

            foreach (var item in regionCode)
            {
                regionCodeCount region = new regionCodeCount();
                region.regionCode = item.code;
                region.count      = item.cnt;
                regionCodeCount.Add(region);
            }
            employeeListViewModel.regionCodeCount = regionCodeCount;


            var countrySet = from m in employees
                             where m.event1 == "open"
                             join code in areaInfo on m.email equals code.Email
                             group code by code.Country into grp
                             select new { code = grp.Key, cnt = grp.Distinct().Count(), regionCode = grp.First().AreaCode };
            List <countryCount> america      = new List <countryCount>();
            List <countryCount> asianPacific = new List <countryCount>();
            List <countryCount> europe       = new List <countryCount>();

            foreach (var country in countrySet)
            {
                countryCount cty = new countryCount();
                cty.country = country.code;
                cty.count   = country.cnt;
                switch (country.regionCode)
                {
                case "AMS":
                    america.Add(cty);
                    break;

                case "EUR":
                    europe.Add(cty);
                    break;

                case "APJ":
                    asianPacific.Add(cty);
                    break;
                }
            }
            employeeListViewModel.america      = america;
            employeeListViewModel.europe       = europe;
            employeeListViewModel.asianPacific = asianPacific;

            foreach (Employee emp in employees)
            {
                EmployeeViewModel empViewModel = new EmployeeViewModel();
                empViewModel.Id        = emp.Id;
                empViewModel.email     = emp.email;
                empViewModel.event1    = emp.event1;
                empViewModel.timestamp = emp.timestamp;
                empViewModels.Add(empViewModel);
            }
            employeeListViewModel.Employees              = empViewModels;
            employeeListViewModel.FooterData             = new FooterViewModel();
            employeeListViewModel.FooterData.CompanyName = "DYD Creative Solution";//Can be set to dynamic value
            employeeListViewModel.FooterData.Year        = DateTime.Now.Year.ToString();
            return(View("Index", employeeListViewModel));
        }
Пример #3
0
        public ActionResult DateRange()
        {
            if (Request.Form["StartDate"].Length != 0)
            {
                GlobalVariables.Start = DateTime.Parse(Request.Form["StartDate"]).ToString("o").Substring(0, 10);
            }
            if (Request.Form["EndDate"].Length != 0)
            {
                GlobalVariables.End = DateTime.Parse(Request.Form["EndDate"]).ToString("o").Substring(0, 10);
            }

            ReportListViewModel ReportListViewModel = new ReportListViewModel();
            ReportBusinessLayer empBal     = new ReportBusinessLayer();
            List <LogRecord>    AllRecords = empBal.GetRecords();
            //System.Diagnostics.Debug.WriteLine(AllRecords.Count() + "all count is");
            string Start = GlobalVariables.Start;
            string End   = GlobalVariables.End;

            var Reports = from m in AllRecords

                          where (Start.CompareTo(DateTime.Parse(m.DateInclude).ToString("o").Substring(0, 10)) <= 0 && End.CompareTo(DateTime.Parse(m.DateInclude).ToString("o").Substring(0, 10)) >= 0)
                          select m;

            ReportListViewModel.Start = DateTime.Parse(Start).ToString("d");
            ReportListViewModel.End   = DateTime.Parse(End).ToString("d");

            List <ReportViewModel> repViewModels = new List <ReportViewModel>();

            List <ReportViewModel> reportViewModels = new List <ReportViewModel>();

            List <Employee> allEmployees = new List <Employee>();

            allEmployees = empBal.GetEmployees();
            //System.Diagnostics.Debug.WriteLine(allEmployees.Count() + "all employee count is");
            // group by email so that repetiotiones in the data won't affect the result
            List <LogRecord> temp = new List <LogRecord>();

            foreach (LogRecord rec in AllRecords)
            {
                rec.Email = rec.Email.Replace(" ", "").ToLower();
                temp.Add(rec);
            }
            AllRecords = temp;



            List <Employee> tempEmp = new List <Employee>();

            foreach (Employee rec in allEmployees)
            {
                rec.Email = rec.Email.Replace(" ", "").ToLower();
                tempEmp.Add(rec);
            }
            allEmployees = tempEmp;


            var ep = from e in allEmployees
                     group e by e.Email into grp
                     select new Employee
            {
                Email    = grp.Key,
                L1       = grp.Last().L1,
                L2       = grp.Last().L2,
                L3       = grp.Last().L3,
                L4       = grp.Last().L4,
                L5       = grp.Last().L5,
                AreaCode = grp.Last().AreaCode,
                Country  = grp.Last().Country,
                Status   = grp.Last().Status
            };

            List <Employee> employees = (List <Employee>)ep.ToList();


            if (Request.Form.AllKeys.Contains("L1"))
            {
                string L1 = Request.Form["L1"];
                if (!L1.Equals(""))
                {
                    string[]      L1Values = Regex.Split(L1, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
                    List <string> L1List   = L1Values.OfType <string>().ToList();
                    employees = employees.Where(a => L1List.Contains(a.L1)).ToList();

                    GlobalVariables.L1List             = L1List;
                    ReportListViewModel.SelectedL1List = L1List;
                }
            }
            else
            {
                GlobalVariables.L1List             = GlobalVariables.Base.L1List;
                ReportListViewModel.SelectedL1List = GlobalVariables.Base.L1List;
            }

            if (Request.Form.AllKeys.Contains("L2"))
            {
                string L2 = Request.Form["L2"];
                if (!L2.Equals(""))
                {
                    string[]      L2Values = Regex.Split(L2, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
                    List <string> L2List   = L2Values.OfType <string>().ToList();
                    employees = employees.Where(a => L2List.Contains(a.L2)).ToList();

                    GlobalVariables.L2List             = L2List;
                    ReportListViewModel.SelectedL2List = L2List;
                }
            }
            else
            {
                GlobalVariables.L2List             = GlobalVariables.Base.L2List;
                ReportListViewModel.SelectedL2List = GlobalVariables.Base.L2List;
            }

            if (Request.Form.AllKeys.Contains("L3"))
            {
                string L3 = Request.Form["L3"];
                if (!L3.Equals(""))
                {
                    string[]      L3Values = Regex.Split(L3, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
                    List <string> L3List   = L3Values.OfType <string>().ToList();
                    employees = employees.Where(a => L3List.Contains(a.L3)).ToList();

                    GlobalVariables.L3List             = L3List;
                    ReportListViewModel.SelectedL3List = L3List;
                }
            }
            else
            {
                GlobalVariables.L3List             = GlobalVariables.Base.L3List;
                ReportListViewModel.SelectedL3List = GlobalVariables.Base.L3List;
            }

            if (Request.Form.AllKeys.Contains("L4"))
            {
                string L4 = Request.Form["L4"];
                if (!L4.Equals(""))
                {
                    string[]      L4Values = Regex.Split(L4, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
                    List <string> L4List   = L4Values.OfType <string>().ToList();
                    employees = employees.Where(a => L4List.Contains(a.L4)).ToList();

                    GlobalVariables.L4List             = L4List;
                    ReportListViewModel.SelectedL4List = L4List;
                }
            }
            else
            {
                GlobalVariables.L4List             = GlobalVariables.Base.L4List;
                ReportListViewModel.SelectedL4List = GlobalVariables.Base.L4List;
            }

            if (Request.Form.AllKeys.Contains("L5"))
            {
                string L5 = Request.Form["L5"];
                if (!L5.Equals(""))
                {
                    string[]      L5Values = Regex.Split(L5, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
                    List <string> L5List   = L5Values.OfType <string>().ToList();
                    employees = employees.Where(a => L5List.Contains(a.L5)).ToList();

                    GlobalVariables.L5List             = L5List;
                    ReportListViewModel.SelectedL5List = L5List;
                }
            }
            else
            {
                GlobalVariables.L5List             = GlobalVariables.Base.L5List;
                ReportListViewModel.SelectedL5List = GlobalVariables.Base.L5List;
            }

            if (Request.Form.AllKeys.Contains("Region"))
            {
                string Region = Request.Form["Region"];
                if (!Region.Equals(""))
                {
                    string[]      RegionValues = Regex.Split(Region, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
                    List <string> RegionList   = RegionValues.OfType <string>().ToList();
                    if (RegionList.Contains("EMEA") && !RegionList.Contains("EUR"))
                    {
                        RegionList.Add("EUR");
                    }
                    if (RegionList.Contains("EUR") && !RegionList.Contains("EMEA"))
                    {
                        RegionList.Add("EMEA");
                    }
                    employees = employees.Where(a => RegionList.Contains(a.AreaCode)).ToList();

                    GlobalVariables.RegionList             = RegionList;
                    ReportListViewModel.SelectedRegionList = RegionList;
                }
            }
            else
            {
                GlobalVariables.RegionList             = GlobalVariables.Base.RegionList;
                ReportListViewModel.SelectedRegionList = GlobalVariables.Base.RegionList;
            }

            if (Request.Form.AllKeys.Contains("Country"))
            {
                string Country = Request.Form["Country"];
                if (!Country.Equals(""))
                {
                    string[]      CountryValues = Regex.Split(Country, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
                    List <string> CountryList   = CountryValues.OfType <string>().ToList();
                    employees = employees.Where(a => CountryList.Contains(a.Country)).ToList();

                    GlobalVariables.CountryList             = CountryList;
                    ReportListViewModel.SelectedCountryList = CountryList;
                }
            }
            else
            {
                GlobalVariables.CountryList             = GlobalVariables.Base.CountryList;
                ReportListViewModel.SelectedCountryList = GlobalVariables.Base.CountryList;
            }

            if (Request.Form.AllKeys.Contains("Status"))
            {
                string Status = Request.Form["Status"];
                if (!Status.Equals(""))
                {
                    string[]      StatusValues = Regex.Split(Status, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
                    List <string> StatusList   = StatusValues.OfType <string>().ToList();
                    employees = employees.Where(a => StatusList.Contains(a.Status)).ToList();

                    GlobalVariables.StatusList             = StatusList;
                    ReportListViewModel.SelectedStatusList = StatusList;
                }
            }
            else
            {
                GlobalVariables.StatusList             = GlobalVariables.Base.StatusList;
                ReportListViewModel.SelectedStatusList = GlobalVariables.Base.StatusList;
            }

            Reports = from m in Reports
                      join e in employees on m.Email equals e.Email
                      select m;

            System.Diagnostics.Debug.WriteLine(Reports.Count() + " after join count is");
            var email = from m in Reports
                        select m.Email;

            int uniqueUser = email.Distinct().Count();

            ReportListViewModel.UniqueUser = uniqueUser;

            // group the email info by date
            var dateInfo = from m in Reports
                           where m.Event1 == "open"
                           orderby DateTime.Parse(m.DateInclude).ToString("o").Substring(0, 10)
                           group m by DateTime.Parse(m.DateInclude).ToString("o").Substring(0, 10) into grp
                           select new DateCount
            {
                Date = grp.Key, Count = grp.Count()
            };

            // store the info of date into list
            List <DateCount> dateCount = dateInfo.ToList();



            //find out the infomaition of the openned emails
            var dateRegionInfo = from m in Reports
                                 where m.Event1 == "open"
                                 join code in employees on m.Email equals code.Email into ji
                                 from sub in ji.DefaultIfEmpty()
                                 select new { date = DateTime.Parse(m.DateInclude).ToString("o").Substring(0, 10), region = sub?.AreaCode ?? String.Empty };
            List <DateCount> finalDateCount = new List <DateCount>();

            //calculate the count for each region for each day
            foreach (var item in dateCount)
            {
                int APJCount  = 0;
                int AMSCount  = 0;
                int EMEACount = 0;
                int UnGrouped = 0;
                foreach (var it in dateRegionInfo)
                {
                    if (item.Date.Equals(it.date))
                    {
                        switch (it.region)
                        {
                        case "AMS":
                            AMSCount++;
                            break;

                        case "EUR":
                            EMEACount++;
                            break;

                        case "APJ":
                            APJCount++;
                            break;

                        case "EMEA":
                            EMEACount++;
                            break;

                        default:
                            UnGrouped++;
                            break;
                        }
                    }
                }
                item.AMSCount  = AMSCount;
                item.APJCount  = APJCount;
                item.EMEACount = EMEACount;
                item.UnGrouped = UnGrouped;
                finalDateCount.Add(item);
            }

            ReportListViewModel.DateCount = finalDateCount;


            var clickUser = from m in Reports
                            where m.Event1 == "click"
                            select m.Email;
            int uniqueClickUser = clickUser.Distinct().Count();

            ReportListViewModel.UniqueClickUser = uniqueClickUser;

            var urlInfo = from m in Reports
                          where m.Url != ""
                          group m by m.Url.Split('/')[m.Url.Split('/').Count() - 1] into grp
                          orderby grp.Key
                          select new { key = grp.Key, cnt = grp.Count() };
            List <UrlCount> urlCount = new List <UrlCount>();

            foreach (var item in urlInfo)
            {
                UrlCount url = new UrlCount();
                url.Url   = item.key;
                url.Count = item.cnt;
                urlCount.Add(url);
            }
            ReportListViewModel.UrlCount = urlCount;

            var open = from re in Reports
                       where re.Event1 == "open"
                       select re.Email;
            var click = from re in Reports
                        where re.Event1 == "click"
                        select re.Email;
            var delivered = from re in Reports
                            where re.Event1 == "delivered"
                            select re.Email;

            ReportListViewModel.OpenCount      = open.Distinct().Count();
            ReportListViewModel.ClickCount     = click.Distinct().Count();
            ReportListViewModel.DeliveredCount = delivered.Distinct().Count();


            var regionCode = from m in open.Distinct()
                             join code in employees on m equals code.Email
                             group code by code.AreaCode into grp
                             select new { code = grp.Key, cnt = grp.Distinct().Count() };

            List <RegionCodeCount> regionCodeCount = new List <RegionCodeCount>();
            int i = 0;

            for (i = 0; i < 4; i++)
            {
                RegionCodeCount region = new RegionCodeCount();
                regionCodeCount.Add(region);
            }

            var upgroupedCount = open.Distinct().Count();

            System.Diagnostics.Debug.WriteLine(upgroupedCount + "count is");
            foreach (var item in regionCode)
            {
                switch (item.code)
                {
                case "AMS":
                    regionCodeCount.ElementAt(0).RegionCode = item.code;
                    regionCodeCount.ElementAt(0).Count      = item.cnt;
                    upgroupedCount -= item.cnt;
                    break;

                case "EMEA":
                    regionCodeCount.ElementAt(1).RegionCode = item.code;
                    regionCodeCount.ElementAt(1).Count     += item.cnt;
                    upgroupedCount -= item.cnt;
                    break;

                case "EUR":
                    //regionCodeCount.ElementAt(1).RegionCode = item.code;
                    regionCodeCount.ElementAt(1).Count += item.cnt;
                    upgroupedCount -= item.cnt;
                    break;

                case "APJ":
                    regionCodeCount.ElementAt(2).RegionCode = item.code;
                    regionCodeCount.ElementAt(2).Count      = item.cnt;
                    upgroupedCount -= item.cnt;
                    break;
                }
            }

            regionCodeCount.ElementAt(3).RegionCode = "Ungrouped";
            regionCodeCount.ElementAt(3).Count      = upgroupedCount;
            //System.Diagnostics.Debug.WriteLine(upgroupedCount + "count is");

            ReportListViewModel.RegionCodeCount = regionCodeCount;


            var countrySet = from m in Reports
                             where m.Event1 == "open"
                             join code in employees on m.Email equals code.Email
                             group code by code.Country into grp
                             select new { code = grp.Key, cnt = grp.Distinct().Count(), regionCode = grp.First().AreaCode };
            List <CountryCount> america      = new List <CountryCount>();
            List <CountryCount> asianPacific = new List <CountryCount>();
            List <CountryCount> europe       = new List <CountryCount>();
            List <CountryCount> EMEA         = new List <CountryCount>();

            foreach (var country in countrySet)
            {
                CountryCount cty = new CountryCount();
                cty.Country = country.code;
                cty.Count   = country.cnt;
                switch (country.regionCode)
                {
                case "AMS":
                    america.Add(cty);
                    break;

                case "EUR":
                    EMEA.Add(cty);
                    break;

                case "APJ":
                    asianPacific.Add(cty);
                    break;

                case "EMEA":
                    EMEA.Add(cty);
                    break;
                }
            }

            var orderedAmerica = from m in america
                                 orderby m.Count descending
                                 select m;
            var orderedEurope = from m in europe
                                orderby m.Count descending
                                select m;
            var orderedAsianPacfic = from m in asianPacific
                                     orderby m.Count descending
                                     select m;
            var orderedEMEA = from m in EMEA
                              orderby m.Count descending
                              select m;

            ReportListViewModel.America      = orderedAmerica.ToList();
            ReportListViewModel.Europe       = orderedEurope.ToList();
            ReportListViewModel.AsianPacific = orderedAsianPacfic.ToList();
            ReportListViewModel.EMEA         = orderedEMEA.ToList();

            foreach (LogRecord emp in Reports)
            {
                ReportViewModel reportViewModel = new ReportViewModel();
                reportViewModel.Email  = emp.Email;
                reportViewModel.Event1 = emp.Event1;
                reportViewModels.Add(reportViewModel);
            }
            ReportListViewModel.Records = reportViewModels;

            JavaScriptSerializer jss = new JavaScriptSerializer();
            List <CountryCount>  Map = new List <CountryCount>();

            Map.AddRange(america);
            Map.AddRange(asianPacific);
            Map.AddRange(europe);
            Map.AddRange(EMEA);
            string output = jss.Serialize(Map);

            output = output.Replace("\"Country\"", "name").Replace("\"Count\"", "value").Replace("\"", "\'").Replace("\'Korea, Republic of\'", "South Korea");
            ReportListViewModel.json     = output;
            ReportListViewModel.WorldMap = !output.Equals("");


            string GraphLine = jss.Serialize(ReportListViewModel.DateCount);

            GraphLine = GraphLine.Replace("\"Date\"", "Date").Replace("\"APJCount\"", "APJ").Replace("\"AMSCount\"", "AMS").Replace("\"EURCount\"", "EUR").Replace("\"EMEACount\"", "EMEA").Replace("\"", "\'");
            ReportListViewModel.GraphLine = GraphLine;
            //System.Diagnostics.Debug.WriteLine(GraphLine);
            ReportListViewModel.NotInListCount = GlobalVariables.NotFoundCount;

            ReportListViewModel.L1List      = GlobalVariables.Base.L1List;
            ReportListViewModel.L2List      = GlobalVariables.Base.L2List;
            ReportListViewModel.L3List      = GlobalVariables.Base.L3List;
            ReportListViewModel.L4List      = GlobalVariables.Base.L4List;
            ReportListViewModel.L5List      = GlobalVariables.Base.L5List;
            ReportListViewModel.CountryList = GlobalVariables.Base.CountryList;
            ReportListViewModel.RegionList  = GlobalVariables.Base.RegionList;
            ReportListViewModel.StatusList  = GlobalVariables.Base.StatusList;
            return(View("Index", ReportListViewModel));
        }
Пример #4
0
        // GET: Report
        public ActionResult Index()
        {
            ReportListViewModel ReportListViewModel = new ReportListViewModel();
            ReportBusinessLayer empBal = new ReportBusinessLayer();

            //get log recordsords from DB
            List <LogRecord>       allReports       = empBal.GetRecords();
            List <ReportViewModel> reportViewModels = new List <ReportViewModel>();

            List <LogRecord> temp = new List <LogRecord>();

            foreach (LogRecord rec in allReports)
            {
                rec.Email = rec.Email.Replace(" ", "").ToLower();
                temp.Add(rec);
            }
            allReports = temp;

            //get employee info from DB
            List <Employee> allEmployees = new List <Employee>();

            allEmployees = empBal.GetEmployees();

            List <Employee> tempEmp = new List <Employee>();

            foreach (Employee rec in allEmployees)
            {
                rec.Email = rec.Email.Replace(" ", "").ToLower();
                tempEmp.Add(rec);
            }
            allEmployees = tempEmp;

            // group by email so that repetiotiones in the data won't affect the result
            var ep = from e in allEmployees
                     group e by e.Email into grp
                     select new Employee {
                Email    = grp.Key, L1 = grp.Last().L1, L2 = grp.Last().L2, L3 = grp.Last().L3, L4 = grp.Last().L4, L5 = grp.Last().L5,
                AreaCode = grp.Last().AreaCode, Country = grp.Last().Country, Status = grp.Last().Status
            };


            List <Employee> employees = (List <Employee>)ep.ToList();
            //System.Diagnostics.Debug.WriteLine(employees.Count());
            // initialize regionCodeCount list to avoid null pointer exception
            List <RegionCodeCount> regionCodeCount = new List <RegionCodeCount>();
            var i = 0;

            for (i = 0; i < 4; i++)
            {
                RegionCodeCount region = new RegionCodeCount();
                region.Count = 0;
                regionCodeCount.Add(region);
            }
            ReportListViewModel.RegionCodeCount = regionCodeCount;



            // initialize base view model
            BaseViewModel Base = new BaseViewModel();
            var           L1   = from e in employees
                                 select e.L1;
            List <string> L1l = L1.Distinct().ToList();

            L1l.Sort();
            Base.L1List = L1l;

            var L2 = from e in employees
                     select e.L2;
            List <string> L2l = L2.Distinct().ToList();

            L2l.Sort();
            Base.L2List = L2l;

            var L3 = from e in employees
                     select e.L3;
            List <string> L3l = L3.Distinct().ToList();

            L3l.Sort();

            Base.L3List = L3l;

            var L4 = from e in employees
                     select e.L4;
            List <string> L4l = L4.Distinct().ToList();

            L4l.Sort();
            Base.L4List = L4l;

            var L5 = from e in employees
                     select e.L5;
            List <string> L5l = L5.Distinct().ToList();

            L5l.Sort();
            Base.L5List = L5l;

            var CountryList = from e in employees
                              select e.Country;
            List <string> Countryl = CountryList.Distinct().ToList();

            Countryl.Sort();
            Base.CountryList = Countryl;

            var RegionList = from e in employees
                             select e.AreaCode;
            List <string> Regionl = RegionList.Distinct().ToList();

            if (Regionl.Contains("EUR"))
            {
                //Regionl.Remove("EUR");
                if (!Regionl.Contains("EMEA"))
                {
                    Regionl.Add("EMEA");
                }
            }
            Regionl.Sort();
            Base.RegionList = Regionl;

            var StatusList = from e in employees
                             select e.Status;
            List <string> Statusl = StatusList.Distinct().ToList();

            Statusl.Sort();
            Base.StatusList = Statusl;

            //Reset gloabal variables
            GlobalVariables.Base        = Base;
            GlobalVariables.L1List      = L1l;
            GlobalVariables.L2List      = L2l;
            GlobalVariables.L3List      = L3l;
            GlobalVariables.L4List      = L4l;
            GlobalVariables.L5List      = L5l;
            GlobalVariables.RegionList  = Regionl;
            GlobalVariables.CountryList = Countryl;
            GlobalVariables.StatusList  = Statusl;

            ReportListViewModel.L1List      = GlobalVariables.Base.L1List;
            ReportListViewModel.L2List      = GlobalVariables.Base.L2List;
            ReportListViewModel.L3List      = GlobalVariables.Base.L3List;
            ReportListViewModel.L4List      = GlobalVariables.Base.L4List;
            ReportListViewModel.L5List      = GlobalVariables.Base.L5List;
            ReportListViewModel.CountryList = GlobalVariables.Base.CountryList;
            ReportListViewModel.RegionList  = GlobalVariables.Base.RegionList;
            ReportListViewModel.StatusList  = GlobalVariables.Base.StatusList;

            //set the date range to show, default is one month ago untill now
            DateTime End   = DateTime.Today;
            DateTime Start = DateTime.Today.AddMonths(-1);

            ReportListViewModel.Start = Start.ToString("d");
            ReportListViewModel.End   = End.ToString("d");


            GlobalVariables.Start = Start.ToString("o").Substring(0, 10);
            GlobalVariables.End   = End.ToString("o").Substring(0, 10);

            // select the records within this data range
            var aReports = from m in allReports
                           where (GlobalVariables.Start.CompareTo(DateTime.Parse(m.DateInclude).ToString("o").Substring(0, 10)) <= 0 && GlobalVariables.End.CompareTo(DateTime.Parse(m.DateInclude).ToString("o").Substring(0, 10)) >= 0)
                           select m;

            var allEmail = from m in aReports
                           select m.Email;

            var filteredReports = from m in aReports
                                  join e in employees on m.Email equals e.Email
                                  select m;

            List <LogRecord> Reports = filteredReports.ToList();

            var email = from m in Reports
                        select m.Email;



            var notInListEmail = allEmail.Except(email);

            ReportListViewModel.NotInListCount = notInListEmail.Distinct().Count();
            GlobalVariables.NotFoundCount      = ReportListViewModel.NotInListCount;
            var notFoundRec = from m in aReports
                              join e in notInListEmail on m.Email equals e
                              select m;
            List <LogRecord> notFoundRecords = notFoundRec.ToList();

            GlobalVariables.NotFoundRecords = notFoundRecords;


            //get the number of unique users from their emails
            int uniqueUser = email.Distinct().Count();

            ReportListViewModel.UniqueUser = uniqueUser;

            // group the email info by date
            var dateInfo = from m in Reports
                           where m.Event1 == "open"
                           orderby DateTime.Parse(m.DateInclude).ToString("o").Substring(0, 10)
                           group m by DateTime.Parse(m.DateInclude).ToString("o").Substring(0, 10) into grp
                           select new DateCount
            {
                Date = grp.Key, Count = grp.Count()
            };

            // store the info of date into list
            List <DateCount> dateCount = dateInfo.ToList();



            //find out the infomaition of the openned emails
            var dateRegionInfo = from m in Reports
                                 where m.Event1 == "open"
                                 join code in employees on m.Email equals code.Email into ji
                                 from sub in ji.DefaultIfEmpty()
                                 select new { date = DateTime.Parse(m.DateInclude).ToString("o").Substring(0, 10), region = sub?.AreaCode ?? String.Empty };
            List <DateCount> finalDateCount = new List <DateCount>();

            //calculate the count for each region for each day
            foreach (var item in dateCount)
            {
                int APJCount  = 0;
                int AMSCount  = 0;
                int EMEACount = 0;
                int UnGrouped = 0;
                foreach (var it in dateRegionInfo)
                {
                    if (item.Date.Equals(it.date))
                    {
                        switch (it.region)
                        {
                        case "AMS":
                            AMSCount++;
                            break;

                        case "EUR":
                            EMEACount++;
                            break;

                        case "APJ":
                            APJCount++;
                            break;

                        case "EMEA":
                            EMEACount++;
                            break;

                        default:
                            UnGrouped++;
                            break;
                        }
                    }
                }
                item.AMSCount  = AMSCount;
                item.APJCount  = APJCount;
                item.EMEACount = EMEACount;
                item.UnGrouped = UnGrouped;
                finalDateCount.Add(item);
            }

            ReportListViewModel.DateCount = finalDateCount;


            //get the number of users who click in the url
            var clickUser = from m in Reports
                            where m.Event1 == "click"
                            select m.Email;
            int uniqueClickUser = clickUser.Distinct().Count();

            ReportListViewModel.UniqueClickUser = uniqueClickUser;

            // group the users by url and save the number into list
            var urlInfo = from m in Reports
                          where m.Url != ""
                          group m by m.Url.Split('/')[m.Url.Split('/').Count() - 1] into grp
                          orderby grp.Key
                          select new { key = grp.Key, cnt = grp.Count() };
            List <UrlCount> urlCount = new List <UrlCount>();

            foreach (var item in urlInfo)
            {
                UrlCount url = new UrlCount();
                url.Url   = item.key;
                url.Count = item.cnt;
                urlCount.Add(url);
            }
            ReportListViewModel.UrlCount = urlCount;


            //get the unique users for open, click and deliver

            var open = from re in Reports
                       where re.Event1 == "open"
                       select re.Email;
            var click = from re in Reports
                        where re.Event1 == "click"
                        select re.Email;
            var delivered = from re in Reports
                            where re.Event1 == "delivered"
                            select re.Email;

            ReportListViewModel.OpenCount      = open.Distinct().Count();
            ReportListViewModel.ClickCount     = click.Distinct().Count();
            ReportListViewModel.DeliveredCount = delivered.Distinct().Count();

            if (employees.Count() == 0)
            {
                return(View("Index", ReportListViewModel));
            }

            // get the number of people who open the emails from different regions
            var regionCode = from m in open.Distinct()
                             join code in employees on m equals code.Email
                             group code by code.AreaCode into grp
                             select new { code = grp.Key, cnt = grp.Distinct().Count() };

            // add region count for for regions and update the number of users
            regionCodeCount = new List <RegionCodeCount>();

            for (i = 0; i < 4; i++)
            {
                RegionCodeCount region = new RegionCodeCount();
                regionCodeCount.Add(region);
            }
            var upgroupedCount = open.Distinct().Count();

            System.Diagnostics.Debug.WriteLine(upgroupedCount + "count is");
            foreach (var item in regionCode)
            {
                switch (item.code)
                {
                case "AMS":
                    regionCodeCount.ElementAt(0).RegionCode = item.code;
                    regionCodeCount.ElementAt(0).Count      = item.cnt;
                    upgroupedCount -= item.cnt;
                    break;

                case "EMEA":
                    regionCodeCount.ElementAt(1).RegionCode = item.code;
                    regionCodeCount.ElementAt(1).Count     += item.cnt;
                    upgroupedCount -= item.cnt;
                    break;

                case "EUR":
                    //regionCodeCount.ElementAt(1).RegionCode = item.code;
                    regionCodeCount.ElementAt(1).Count += item.cnt;
                    upgroupedCount -= item.cnt;
                    break;

                case "APJ":
                    regionCodeCount.ElementAt(2).RegionCode = item.code;
                    regionCodeCount.ElementAt(2).Count      = item.cnt;
                    upgroupedCount -= item.cnt;
                    break;
                }
            }
            System.Diagnostics.Debug.WriteLine(upgroupedCount + "count is");
            regionCodeCount.ElementAt(3).RegionCode = "Ungrouped";
            regionCodeCount.ElementAt(3).Count      = upgroupedCount;
            ReportListViewModel.RegionCodeCount     = regionCodeCount;

            // group data by country and put them in to coresponding region group
            var countrySet = from m in Reports
                             where m.Event1 == "open"
                             join code in employees on m.Email equals code.Email
                             group code by code.Country into grp
                             select new { code = grp.Key, cnt = grp.Distinct().Count(), regionCode = grp.First().AreaCode };
            List <CountryCount> america      = new List <CountryCount>();
            List <CountryCount> asianPacific = new List <CountryCount>();
            List <CountryCount> europe       = new List <CountryCount>();
            List <CountryCount> EMEA         = new List <CountryCount>();

            foreach (var country in countrySet)
            {
                CountryCount cty = new CountryCount();
                cty.Country = country.code;
                cty.Count   = country.cnt;
                switch (country.regionCode)
                {
                case "AMS":
                    america.Add(cty);
                    break;

                case "EUR":
                    EMEA.Add(cty);
                    break;

                case "APJ":
                    asianPacific.Add(cty);
                    break;

                case "EMEA":
                    EMEA.Add(cty);
                    break;
                }
            }

            var orderedAmerica = from m in america
                                 orderby m.Count descending
                                 select m;
            var orderedEurope = from m in europe
                                orderby m.Count descending
                                select m;
            var orderedAsianPacfic = from m in asianPacific
                                     orderby m.Count descending
                                     select m;
            var orderedEMEA = from m in EMEA
                              orderby m.Count descending
                              select m;

            ReportListViewModel.America      = orderedAmerica.ToList();
            ReportListViewModel.Europe       = orderedEurope.ToList();
            ReportListViewModel.AsianPacific = orderedAsianPacfic.ToList();
            ReportListViewModel.EMEA         = orderedEMEA.ToList();


            foreach (LogRecord emp in Reports)
            {
                ReportViewModel reportViewModel = new ReportViewModel();
                reportViewModel.Email  = emp.Email;
                reportViewModel.Event1 = emp.Event1;
                reportViewModels.Add(reportViewModel);
            }
            ReportListViewModel.Records = reportViewModels;

            //genereate the data for the world map and the line graph
            JavaScriptSerializer jss = new JavaScriptSerializer();

            List <CountryCount> Map = new List <CountryCount>();

            Map.AddRange(america);
            Map.AddRange(asianPacific);
            Map.AddRange(EMEA);
            string output = jss.Serialize(Map);

            output = output.Replace("\"Country\"", "name").Replace("\"Count\"", "value").Replace("\"", "\'");
            ReportListViewModel.json = output;
            //System.Diagnostics.Debug.WriteLine(output);


            string GraphLine = jss.Serialize(ReportListViewModel.DateCount);

            GraphLine = GraphLine.Replace("\"Date\"", "Date").Replace("\"APJCount\"", "APJ").Replace("\"AMSCount\"", "AMS").Replace("\"EURCount\"", "EUR").Replace("\"EMEACount\"", "EMEA").Replace("\"", "\'");
            ReportListViewModel.GraphLine = GraphLine;
            //System.Diagnostics.Debug.WriteLine(GraphLine);
            return(View("Index", ReportListViewModel));
        }