public async Task <ActionResult> GetOverview(DateTime?startDate, DateTime?endDate, DateTime?trackUnitStartDate, DateTime?trackUnitEndDate, string venueCode, string contactPersonId, string selectMachine, int?trackUnitHours, bool?trackUnitCurrentRentals, bool?trackUnitClosedRentals, bool?trackUnitPendingDeliveries, bool?trackUnitPendingCollections)
        {
            if (!ActiveCustomer.showOverview)
            {
                return(HttpNotFound());
            }
            // *** Populate session variables with new valuespassed in
            if (startDate.HasValue)
            {
                Session["StartDate"] = startDate.Value;
            }
            if (endDate.HasValue)
            {
                Session["EndDate"] = endDate.Value;
            }
            if (trackUnitStartDate.HasValue)
            {
                Session["TrackUnitStartDate"] = trackUnitStartDate;
            }
            if (trackUnitEndDate.HasValue)
            {
                Session["TrackUnitEndDate"] = trackUnitEndDate;
            }
            if (trackUnitHours.HasValue)
            {
                Session["TrackUnitHours"] = trackUnitHours;
            }
            if (venueCode != null)
            {
                Session["venueCode"] = venueCode;
            }
            if (contactPersonId != null)
            {
                Session["contactPersonId"] = contactPersonId;
            }
            if (trackUnitCurrentRentals.HasValue && trackUnitCurrentRentals.Value == true)
            {
                Session["TrackUnitCurrentRentals"] = true;
            }
            else
            {
                Session["TrackUnitCurrentRentals"] = false;
            }
            if (trackUnitClosedRentals.HasValue && trackUnitClosedRentals.Value == true)
            {
                Session["TrackUnitClosedRentals"] = true;
            }
            else
            {
                Session["TrackUnitClosedRentals"] = false;
            }
            if (trackUnitPendingDeliveries.HasValue && trackUnitPendingDeliveries.Value == true)
            {
                Session["TrackUnitPendingDeliveries"] = true;
            }
            else
            {
                Session["TrackUnitPendingDeliveries"] = false;
            }
            if (trackUnitPendingCollections.HasValue && trackUnitPendingCollections.Value == true)
            {
                Session["TrackUnitPendingCollections"] = true;
            }
            else
            {
                Session["TrackUnitPendingCollections"] = false;
            }

            if (selectMachine != null)
            {
                if (selectMachine == "-1")
                {
                    Session["SelectedMachine"] = null;
                }
                else
                {
                    Session["SelectedMachine"] = selectMachine;
                }
            }

            // *** Populate the model with basic info about customer, and filters passed in
            OverviewViewModel model = new OverviewViewModel();
            var userCustomers       = (await db.GetUserCustomers(User.Identity.GetUserId())).Select(x => new { CustomerKey = x.CustomerKey, CustomerName = String.Format("{0} ({1})", x.Name, x.City), CustomerCurrency = x.currency });

            model.userCustomers  = new SelectList(userCustomers, "CustomerKey", "CustomerName", "CustomerCurrency");
            model.accountManager = await db.GetAccountManagerDetails(this.ActiveCustomer);

            model.customerSelected            = this.ActiveCustomer.CustomerKey;
            model.StartDate                   = DateTime.Today.AddMonths(-1);
            model.EndDate                     = DateTime.Today.AddMonths(1);
            model.TrackUnitStartDate          = DateTime.Today.AddMonths(-1);
            model.TrackUnitEndDate            = DateTime.Today.AddMonths(1);
            model.TrackUnitHours              = 120;
            model.TrackUnitCurrentRentals     = (bool)Session["TrackUnitCurrentRentals"];
            model.TrackUnitClosedRentals      = (bool)Session["TrackUnitClosedRentals"];
            model.TrackUnitPendingDeliveries  = (bool)Session["TrackUnitPendingDeliveries"];
            model.TrackUnitPendingCollections = (bool)Session["TrackUnitPendingCollections"];

            if (Session["StartDate"] != null && Session["EndDate"] != null)
            {
                model.StartDate = (DateTime)Session["StartDate"];
                model.EndDate   = (DateTime)Session["EndDate"];
            }
            else
            {
                Session["StartDate"] = model.StartDate;
                Session["EndDate"]   = model.EndDate;
            }

            if (Session["TrackUnitStartDate"] != null && Session["TrackUnitEndDate"] != null)
            {
                model.TrackUnitStartDate = (DateTime)Session["TrackUnitStartDate"];
                model.TrackUnitEndDate   = (DateTime)Session["TrackUnitEndDate"];
            }
            else
            {
                Session["TrackUnitStartDate"] = model.TrackUnitStartDate;
                Session["TrackUnitEndDate"]   = model.TrackUnitEndDate;
            }

            if (Session["TrackUnitHours"] != null)
            {
                model.TrackUnitHours = (int)Session["TrackUnitHours"];
            }
            else
            {
                Session["TrackUnitHours"] = model.TrackUnitHours;
            }

            if (!string.IsNullOrWhiteSpace((string)Session["venueCode"]))
            {
                model.venueCodeSelected = (string)Session["venueCode"];
            }
            else
            {
                Session["venueCode"] = model.venueCodeSelected = "";
            }

            if (!string.IsNullOrWhiteSpace((string)Session["contactPersonId"]))
            {
                model.contactPersonIdSelected = (string)Session["contactPersonId"];
            }
            else
            {
                Session["contactPersonId"] = model.contactPersonIdSelected = "";
            }

            if (!string.IsNullOrWhiteSpace((string)Session["SelectedMachine"]))
            {
                model.selectedMachineSerial = (string)Session["SelectedMachine"];
            }
            else
            {
                Session["SelectedMachine"] = model.selectedMachineSerial = "";
            }

            // *** Orders, Venues and Order Statuses ***
            DateTime minDate;

            if (model.TrackUnitStartDate < model.StartDate)
            {
                minDate = model.TrackUnitStartDate;
            }
            else
            {
                minDate = model.StartDate;
            }

            if (DateTime.Today < minDate)
            {
                minDate = DateTime.Today;
            }

            DateTime maxDate;

            if (model.TrackUnitEndDate > model.EndDate)
            {
                maxDate = model.TrackUnitEndDate;
            }
            else
            {
                maxDate = model.EndDate;
            }

            if (DateTime.Today > maxDate)
            {
                maxDate = DateTime.Today;
            }

            IEnumerable <RentalOrder> fullOrders = await ActiveCustomer.GetRentalOrders(new RentalsDAL(), minDate, maxDate);

            IEnumerable <RentalOrder> orders = fullOrders.Where(i => i.DateOnHire.Date <= model.EndDate.Date && ((!i.DateOffHire.HasValue || i.DateOffHire.Value.Date >= model.StartDate)));

            IEnumerable <RentalOrder> fuelConsumptionPerMachineOrders = fullOrders.Where(i => i.DateOnHire.Date <= model.TrackUnitEndDate.Date && ((!i.DateOffHire.HasValue || i.DateOffHire.Value.Date >= model.TrackUnitStartDate.Date)));

            IEnumerable <RentalOrder> onSiteMachineOrders = fullOrders.Where(i => i.DateOnHire.Date <= DateTime.Today && ((!i.DateOffHire.HasValue || i.DateOffHire.Value.Date >= DateTime.Today)));

            IEnumerable <RentalOrder> filteredOrders = orders;

            List <string> projectVenueCodes = new List <string>();

            IdentityUser userPrefs = (await new ROLWeb.Models.UserStore().FindByIdAsync(User.Identity.GetUserId()));

            if (userPrefs.ShowProjectMachines)
            {
                foreach (RentalOrder order in filteredOrders)
                {
                    if (!projectVenueCodes.Contains(order.RorVenueCode) && order.ContactPersonId == userPrefs.ContactPersonId)
                    {
                        projectVenueCodes.Add(order.RorVenueCode);
                    }
                }
                if (projectVenueCodes.Count() > 0)
                {
                    filteredOrders = filteredOrders.Where(i => projectVenueCodes.Contains(i.RorVenueCode));
                }
            }

            // Populate list of venues based on ALL orders
            var venueCheck = new List <String>();

            model.Venues = filteredOrders
                           .Select <RentalOrder, Venue>(x =>
                                                        new Venue
            {
                DeliveryName = x.DeliveryName,
                DeliveryCity = x.DeliveryCity,
                RorVenueCode = x.RorVenueCode
            })
                           .Distinct()
                           .OrderByDescending(x => venueCheck.Contains(x.RorVenueCode))
                           .ThenBy(y => y.DeliveryName);

            if (projectVenueCodes.Count() > 0)
            {
                model.Venues = model.Venues.Where(i => projectVenueCodes.Contains(i.RorVenueCode));
            }

            // Then filter the orders to only those in the current venue
            if (!string.IsNullOrWhiteSpace(model.venueCodeSelected))
            {
                filteredOrders = filteredOrders.Where(i => i.RorVenueCode == model.venueCodeSelected);
            }

            model.orderContactPeople = new SelectList(filteredOrders.GroupBy(i => i.ContactPersonId).Select(i => i.First()), "ContactPersonId", "ContactPerson");

            if (!string.IsNullOrWhiteSpace(model.contactPersonIdSelected))
            {
                filteredOrders = filteredOrders.Where(i => i.ContactPersonId == model.contactPersonIdSelected);
            }

            string[] CurrentRentalCodes = Models.Rentals.OrderStatus.GetOrderStatusID("CurrentRentals", ActiveCustomer.DatabaseName);

            // Get the count of extras on rent
            model.extrasOnRent = filteredOrders.Where(i => i.ItemGroupId == "31900" && CurrentRentalCodes.Contains(i.OrderStatusId)).Count();

            // Get a list of statuses that exist withn the filterd list of orders remove extras that are on rent
            model.orderStatus = filteredOrders.Where(i => !(i.ItemGroupId == "31900" && CurrentRentalCodes.Contains(i.OrderStatusId))).GroupBy(x => x.OrderStatusId).Select(y => new OrderStatusCount {
                OrderStatusId = y.Key, numOrders = y.Count()
            });

            // *** Cost Overview, exchange rates ***

            IEnumerable <ExchangeRate> exchangeRates = db.GetExchangeRates();

            model.ExchangeRate = exchangeRates.Where(i => i.CountryCode == ActiveCustomer.currency.ToUpper()).FirstOrDefault();

            if (model.ExchangeRate == null)
            {
                model.ExchangeRate = new ExchangeRate()
                {
                    CountryCode = "EUR",
                    EuroRate    = 1m
                };
            }

            model.CostMultiplierElectric = 1m;
            model.CostMultiplierDiesel   = 1m;
            model.CostMultiplierHybrid   = 1m;

            if (ActiveCustomer.currency.ToLower() == "eur")
            {
                model.CurrencySymbol         = "€";
                model.CostMultiplierElectric = 1m;
                if (ActiveCustomer.CompanyId == "140")
                {
                    model.CostMultiplierDiesel = 1.8m;
                }
                else
                {
                    model.CostMultiplierDiesel = 1m;
                }
                model.CostMultiplierHybrid = 1m;
            }
            else if (ActiveCustomer.currency.ToLower() == "dkk")
            {
                model.CurrencySymbol         = "KR";
                model.CostMultiplierDiesel   = 13.98m;
                model.CostMultiplierElectric = 2.3m;
                model.CostMultiplierHybrid   = 1m;
            }
            else if (ActiveCustomer.currency.ToLower() == "sek")
            {
                model.CurrencySymbol         = "SEK";
                model.CostMultiplierDiesel   = 18m;
                model.CostMultiplierElectric = 2.5m;
                model.CostMultiplierHybrid   = 1m;
            }
            else if (ActiveCustomer.currency.ToLower() == "nok")
            {
                model.CurrencySymbol         = "NOK";
                model.CostMultiplierDiesel   = 15m;
                model.CostMultiplierElectric = 2.5m;
                model.CostMultiplierHybrid   = 1m;
            }
            else if (ActiveCustomer.currency.ToLower() == "pln")
            {
                model.CurrencySymbol         = "PLN";
                model.CostMultiplierDiesel   = 1.21m;
                model.CostMultiplierElectric = 1m;
                model.CostMultiplierHybrid   = 1m;
            }
            else if (ActiveCustomer.currency.ToLower() == "gbp")
            {
                model.CurrencySymbol         = "£";
                model.CostMultiplierDiesel   = model.ExchangeRate.EuroRate;
                model.CostMultiplierElectric = model.ExchangeRate.EuroRate;
                model.CostMultiplierHybrid   = model.ExchangeRate.EuroRate;
            }
            else
            {
                model.CurrencySymbol = "€";
            }


            if (ActiveCustomer.showOverviewCosts)
            {
                if (string.IsNullOrWhiteSpace(model.venueCodeSelected))
                {
                    if (ActiveCustomer.showChildBRInvoices)
                    {
                        if (ActiveCustomer.useInvoiceAccount)
                        {
                            model.rentalCosts = await db.GetRentalCostsInvoiceAccountChildBR(this.ActiveCustomer, model.StartDate, model.EndDate);

                            model.rentalCostsLastYear = await db.GetRentalCostsInvoiceAccountChildBR(this.ActiveCustomer, model.StartDate.AddYears(-1), model.EndDate.AddYears(-1));
                        }
                        else
                        {
                            model.rentalCosts = await db.GetRentalCostsOrderAccountChildBR(this.ActiveCustomer, model.StartDate, model.EndDate);

                            model.rentalCostsLastYear = await db.GetRentalCostsOrderAccountChildBR(this.ActiveCustomer, model.StartDate.AddYears(-1), model.EndDate.AddYears(-1));
                        }
                    }
                    else
                    {
                        if (ActiveCustomer.useInvoiceAccount)
                        {
                            model.rentalCosts = await db.GetRentalCostsInvoiceAccount(this.ActiveCustomer, model.StartDate, model.EndDate);

                            model.rentalCostsLastYear = await db.GetRentalCostsInvoiceAccount(this.ActiveCustomer, model.StartDate.AddYears(-1), model.EndDate.AddYears(-1));
                        }
                        else
                        {
                            model.rentalCosts = await db.GetRentalCostsOrderAccount(this.ActiveCustomer, model.StartDate, model.EndDate);

                            model.rentalCostsLastYear = await db.GetRentalCostsOrderAccount(this.ActiveCustomer, model.StartDate.AddYears(-1), model.EndDate.AddYears(-1));
                        }
                    }
                }
                else
                {
                    model.rentalCosts = await db.GetRentalCostsInvoiceVenueAccount(this.ActiveCustomer, model.StartDate, model.EndDate);

                    model.rentalCosts = model.rentalCosts.Where(i => i.RorVenueCode == model.venueCodeSelected);

                    model.rentalCostsLastYear = await db.GetRentalCostsInvoiceVenueAccount(this.ActiveCustomer, model.StartDate.AddYears(-1), model.EndDate.AddYears(-1));

                    model.rentalCostsLastYear = model.rentalCosts.Where(i => i.RorVenueCode == model.venueCodeSelected);
                }
            }

            // *** Response Time ***
            Task GetCustKPIs = new Task(() =>
            {
                if (ActiveCustomer.showOverviewResponseTime || ActiveCustomer.showOverviewMachinesNotInUse)
                {
                    if (string.IsNullOrEmpty(model.venueCodeSelected))
                    {
                        if (projectVenueCodes.Count() > 0)
                        {
                            IEnumerable <CustTRWKPIs> allKPIs = db.GetDWHCustVenuTRWKPIs(ActiveCustomer.DatabaseName, ActiveCustomer.CompanyId, ActiveCustomer.CustomerId, model.venueCodeSelected, model.StartDate, model.EndDate);

                            List <CustTRWKPIs> projectVenueKPIs = allKPIs.Where(i => projectVenueCodes.Contains(i.venuecode)).ToList();

                            List <decimal> resolutionTime = projectVenueKPIs.Where(i => i.avgResolutionTime.HasValue).Select(i => i.avgResolutionTime.Value).ToList();

                            List <decimal> responseTime = projectVenueKPIs.Where(i => i.avgResponseTime.HasValue).Select(i => i.avgResponseTime.Value).ToList();

                            if (projectVenueKPIs.Count > 0)
                            {
                                CustTRWKPIs custTRWKPIs = new CustTRWKPIs()
                                {
                                    companyid              = projectVenueKPIs.First().companyid,
                                    customerid             = projectVenueKPIs.First().customerid,
                                    venuecode              = projectVenueKPIs.First().venuecode,
                                    machineCount           = projectVenueKPIs.Sum(rec => rec.machineCount),
                                    avgResolutionTime      = resolutionTime.Sum(rec => rec),
                                    avgResponseTime        = responseTime.Sum(rec => rec),
                                    firstDayBreakdownCount = projectVenueKPIs.Sum(rec => rec.firstDayBreakdownCount),
                                    onTimeDeliveryCount    = projectVenueKPIs.Sum(rec => rec.onTimeDeliveryCount),
                                    totalDeliveryCount     = projectVenueKPIs.Sum(rec => rec.totalDeliveryCount),
                                    upTimePerc             = projectVenueKPIs.Sum(rec => rec.upTimePerc) / projectVenueKPIs.Count(),
                                    solvedByPhoneCount     = projectVenueKPIs.Sum(rec => rec.solvedByPhoneCount)
                                };

                                if (resolutionTime.Count() > 0)
                                {
                                    custTRWKPIs.avgResolutionTime /= resolutionTime.Count();
                                }

                                if (responseTime.Count() > 0)
                                {
                                    custTRWKPIs.avgResponseTime /= responseTime.Count();
                                }

                                model.ResponseTimeKPI = custTRWKPIs;
                            }

                            var allPickupTimes          = db.GetDWHCustTRWKPI_pickUpTime(ActiveCustomer.DatabaseName, ActiveCustomer.CompanyId, ActiveCustomer.CustomerId, model.StartDate, model.EndDate);
                            model.CustTRWKPI_pickUpTime = allPickupTimes.FirstOrDefault();
                        }
                        else
                        {
                            var allKPIs                 = db.GetDWHCustTRWKPIs(ActiveCustomer.DatabaseName, ActiveCustomer.CompanyId, ActiveCustomer.CustomerId, model.StartDate, model.EndDate);
                            model.ResponseTimeKPI       = allKPIs.FirstOrDefault();
                            var allPickupTimes          = db.GetDWHCustTRWKPI_pickUpTime(ActiveCustomer.DatabaseName, ActiveCustomer.CompanyId, ActiveCustomer.CustomerId, model.StartDate, model.EndDate);
                            model.CustTRWKPI_pickUpTime = allPickupTimes.FirstOrDefault();
                        }
                    }
                    else
                    {
                        var allKPIs           = db.GetDWHCustVenuTRWKPIs(ActiveCustomer.DatabaseName, ActiveCustomer.CompanyId, ActiveCustomer.CustomerId, model.venueCodeSelected, model.StartDate, model.EndDate);
                        model.ResponseTimeKPI = allKPIs.FirstOrDefault(i => i.venuecode == model.venueCodeSelected);

                        var allPickupTimes          = db.GetDWHCustVenuTRWKPI_pickUpTime(ActiveCustomer.DatabaseName, ActiveCustomer.CompanyId, model.venueCodeSelected, ActiveCustomer.CustomerId, model.StartDate, model.EndDate);
                        model.CustTRWKPI_pickUpTime = allPickupTimes.FirstOrDefault();
                    }

                    if (model.ResponseTimeKPI == null)
                    {
                        model.ResponseTimeKPI = new CustTRWKPIs();
                        model.ResponseTimeKPI.avgResponseTime   = 0.0m;
                        model.ResponseTimeKPI.avgResolutionTime = 0.0m;
                    }
                    if (model.ResponseTimeKPI.avgResponseTime == null)
                    {
                        model.ResponseTimeKPI.avgResponseTime = 0.0m;
                    }
                    if (model.ResponseTimeKPI.avgResolutionTime == null)
                    {
                        model.ResponseTimeKPI.avgResolutionTime = 0.0m;
                    }

                    if (model.CustTRWKPI_pickUpTime == null)
                    {
                        model.CustTRWKPI_pickUpTime = new CustTRWKPI_pickUpTime();
                        model.CustTRWKPI_pickUpTime.avgPickupTime = 0.0m;
                    }
                    if (model.CustTRWKPI_pickUpTime.avgPickupTime == null)
                    {
                        model.CustTRWKPI_pickUpTime.avgPickupTime = 0.0m;
                    }

                    //If the active customer is French recalculate the On time delivery KPI
                    if (ActiveCustomer.CompanyId == "140")
                    {
                        model.ResponseTimeKPI.totalDeliveryCount = filteredOrders.Where(i => i.DateOnHire < DateTime.Now).Count();
                    }
                }
            });

            GetCustKPIs.Start();

            // *** Per machine data ***

            Task PerMachineData = new Task(() =>
            {
                model.FuelConsumptionPerMachine = db.GetDWHCustConsPerMachine(ActiveCustomer.DatabaseName, ActiveCustomer.CompanyId, ActiveCustomer.CustomerId, model.TrackUnitStartDate, model.TrackUnitEndDate);

                if (model.TrackUnitCurrentRentals || model.TrackUnitClosedRentals || model.TrackUnitPendingDeliveries || model.TrackUnitPendingCollections)
                {
                    model.TrackUnitRentalCodes = new List <string>();

                    if (model.TrackUnitCurrentRentals == true)
                    {
                        model.TrackUnitRentalCodes.Add(Models.Rentals.OrderStatus.GetOrderStatusID_String("CurrentRentals", ActiveCustomer.DatabaseName));
                    }
                    if (model.TrackUnitClosedRentals == true)
                    {
                        model.TrackUnitRentalCodes.Add(Models.Rentals.OrderStatus.GetOrderStatusID_String("ClosedRentals", ActiveCustomer.DatabaseName));
                    }
                    if (model.TrackUnitPendingDeliveries == true)
                    {
                        model.TrackUnitRentalCodes.Add(Models.Rentals.OrderStatus.GetOrderStatusID_String("PendingDeliveries", ActiveCustomer.DatabaseName));
                    }
                    if (model.TrackUnitPendingCollections == true)
                    {
                        model.TrackUnitRentalCodes.Add(Models.Rentals.OrderStatus.GetOrderStatusID_String("PendingCollections", ActiveCustomer.DatabaseName));
                    }

                    string[] fuelConsumptionPerMachineInventTransIds = fuelConsumptionPerMachineOrders.Where(i => model.TrackUnitRentalCodes.Contains(i.OrderStatusId) && model.FuelConsumptionPerMachine.Select(n => n.inventtransid).Contains(i.InventTransId)).Select(i => i.InventTransId).ToArray();

                    model.FuelConsumptionPerMachine = model.FuelConsumptionPerMachine.Where(i => fuelConsumptionPerMachineInventTransIds.Contains(i.inventtransid));

                    if (!string.IsNullOrWhiteSpace(model.contactPersonIdSelected))
                    {
                        //Bind contactpersonid to matching orders and fuelconsumptions
                        foreach (FuelConsumption machine in model.FuelConsumptionPerMachine)
                        {
                            foreach (RentalOrder order in fuelConsumptionPerMachineOrders)
                            {
                                if (machine.inventtransid == order.InventTransId)
                                {
                                    machine.ContactPersonId = order.ContactPersonId;
                                }
                            }
                        }

                        //Filter to machines with matching contact person id
                        model.FuelConsumptionPerMachine = model.FuelConsumptionPerMachine.Where(i => i.ContactPersonId == model.contactPersonIdSelected);
                    }
                }

                if (projectVenueCodes.Count() > 0)
                {
                    model.FuelConsumptionPerMachine = model.FuelConsumptionPerMachine.Where(i => projectVenueCodes.Contains(i.rorvenuecode));
                }

                if (!string.IsNullOrEmpty(model.venueCodeSelected))
                {
                    model.FuelConsumptionPerMachine = model.FuelConsumptionPerMachine.Where(i => i.rorvenuecode == model.venueCodeSelected).ToList();
                }

                var duplicateMachines = model.FuelConsumptionPerMachine.Where(i => model.FuelConsumptionPerMachine.Where(x => x.inventtransid == i.inventtransid).Count() > 1).GroupBy(n => n.inventtransid);

                List <FuelConsumption> nonDuplicateMachines = model.FuelConsumptionPerMachine.Where(i => model.FuelConsumptionPerMachine.Where(x => x.inventtransid == i.inventtransid).Count() < 2).ToList();

                List <FuelConsumption> summedDuplicates = new List <FuelConsumption>();

                foreach (var inventTransitIdGroup in duplicateMachines)
                {
                    FuelConsumption summedDupplicate      = inventTransitIdGroup.First();
                    summedDupplicate.machineconsumption   = inventTransitIdGroup.Sum(i => i.machineconsumption);
                    summedDupplicate.machineEmission      = inventTransitIdGroup.Sum(i => i.machineEmission);
                    summedDupplicate.machineFuelCost      = inventTransitIdGroup.Sum(i => i.machineFuelCost);
                    summedDupplicate.machinerunningHourM1 = inventTransitIdGroup.Sum(i => i.machinerunningHourM1);
                    summedDupplicate.lastActiveDate       = inventTransitIdGroup.Max(i => i.lastActiveDate);

                    summedDuplicates.Add(summedDupplicate);
                }

                model.FuelConsumptionPerMachine = nonDuplicateMachines.Concat(summedDuplicates);

                //Create list of machine types to populate the overview dropdown
                model.SelectMachines =
                    model.FuelConsumptionPerMachine.Select(i => new SelectMachine()
                {
                    Code = i.serialNumber, Name = i.machineType, FleetNumber = i.fleetNumber
                })
                    .OrderBy(i => i.Name);

                // Filter results based on selected machine type
                if (model.selectedMachineSerial != "")
                {
                    model.FuelConsumptionPerMachine = model.FuelConsumptionPerMachine.Where(i => i.serialNumber == model.selectedMachineSerial).ToList();
                }
            });

            PerMachineData.Start();
            PerMachineData.Wait();

            // *** Machines not in Use ***
            if (ActiveCustomer.showOverviewMachinesNotInUse)
            {
                try
                {
                    var user         = (await new ROLWeb.Models.UserStore().FindByIdAsync(User.Identity.GetUserId()));
                    int daysNotInUse = user.MachinesNotInUseDays;
                    model.MachinesNotInUseHours = daysNotInUse * 24;

                    //Dashboard V1.0 Definition
                    if (ActiveCustomer.overviewVersion == null || ActiveCustomer.overviewVersion == "1")
                    {
                        var customers        = orders.Select(x => x.CustAccount).Distinct();
                        int machinesNotInUse = 0;
                        foreach (string customer in customers)
                        {
                            var machines       = db.GetMachinesNotInUse(this.ActiveCustomer.DatabaseName, this.ActiveCustomer, daysNotInUse.ToString());
                            var ordersMachines = orders.Join(machines, x => new { x.CustAccount, x.SalesId, x.ObjectId }, y => new { CustAccount = customer, y.SalesId, y.ObjectId }, (ord, mac) => ord);
                            machinesNotInUse += ordersMachines.Count();
                        }
                        model.MachinesNotInUse = machinesNotInUse;
                    }

                    //Dashboard V2.0 Definition
                    if (ActiveCustomer.overviewVersion == "2")
                    {
                        //Get required data
                        model.MachinesNotInUse = 0;
                        model.OnSiteMachines   = db.GetDWHMachineOnSite(ActiveCustomer);

                        if (!string.IsNullOrWhiteSpace(model.contactPersonIdSelected))
                        {
                            onSiteMachineOrders = onSiteMachineOrders.Where(i => i.ContactPersonId == model.contactPersonIdSelected);
                        }

                        //Remove OnSiteMachines with no LastActive date
                        model.OnSiteMachines = model.OnSiteMachines.Where(i => i.lastActiveDate.HasValue && i.lastActiveDate != Convert.ToDateTime("1900-01-01")).ToList();

                        IEnumerable <TrackUnitData> units = await rentals_db.GetTrackUnitData();

                        //Filter out machines past the users active hours selection
                        //units = units.Where(i => i.GpsFixTime > DateTime.Now.AddHours(-model.TrackUnitHours));

                        //Remove machines which dont have matching order details
                        List <string> onSiteMachineOrderSerialNumbers = onSiteMachineOrders.Select(i => i.ObjectId).ToList();
                        model.OnSiteMachines = model.OnSiteMachines.Where(i => onSiteMachineOrderSerialNumbers.Contains(i.serialNumber)).ToList();

                        //Remove machines which dont have track unit data

                        List <string> trackUnitSerialNumbers = units.Select(i => i.ReferenceNumber).ToList();
                        model.OnSiteMachines = model.OnSiteMachines.Where(x => trackUnitSerialNumbers.Contains(x.serialNumber)).ToList();

                        //Filter out non venue machines
                        if (!string.IsNullOrWhiteSpace(model.venueCodeSelected))
                        {
                            model.OnSiteMachines = model.OnSiteMachines.Where(i => i.rorvenuecode == model.venueCodeSelected).ToList();
                        }

                        //Filter out non project machines
                        if (projectVenueCodes.Count() > 0)
                        {
                            model.OnSiteMachines = model.OnSiteMachines.Where(i => projectVenueCodes.Contains(i.rorvenuecode)).ToList();
                        }

                        //Count Machines in use

                        foreach (var machine in model.OnSiteMachines)
                        {
                            if (Convert.ToDateTime(machine.lastActiveDate) < DateTime.Now.AddHours(-model.TrackUnitHours) || Convert.ToDateTime(machine.lastActiveDate).Date == DateTime.Now.AddDays(1).Date)
                            {
                                model.MachinesNotInUse++;
                            }
                        }

                        //Apply Track Unit Data
                        model.OnSiteMachines.ForEach(i => i.Process(onSiteMachineOrders.First(x => x.ObjectId == i.serialNumber)));
                        model.OnSiteMachines = model.ProcessOnSiteMachines(model.OnSiteMachines, units);
                        model.MachinesInUse  = model.OnSiteMachines.Count() - model.MachinesNotInUse;
                        if (model.OnSiteMachines == null)
                        {
                            model.OnSiteMachines = new List <OnSiteMachine>();
                        }
                    }
                }
                catch (Exception e)
                {
                    model.OnSiteMachines = new List <OnSiteMachine>();
                    model.MachinesInUse  = 0;
                }
            }
            else
            {
                model.OnSiteMachines = new List <OnSiteMachine>();
            }

            // *** Energy Consumption and CO2 emissions ***
            var consumptionTotals = new List <FuelConsumptionAndEmission>();

            if (ActiveCustomer.showOverviewEnergyConsumption || ActiveCustomer.showOverviewCO2Emissions)
            {
                var machines_GroupedByFuelType = model.FuelConsumptionPerMachine.GroupBy(i => i.fueltype);
                foreach (var machineGroup in machines_GroupedByFuelType)
                {
                    if (!string.IsNullOrWhiteSpace(machineGroup.First().fueltype))
                    {
                        consumptionTotals.Add(new FuelConsumptionAndEmission()
                        {
                            fueltype             = machineGroup.First().fueltype,
                            machineconsumption   = machineGroup.Sum(i => i.machineconsumption),
                            custaccount          = ActiveCustomer.CustomerId,
                            machineEmission      = machineGroup.Sum(i => i.machineEmission),
                            machineFuelCost      = machineGroup.Sum(i => i.machineFuelCost),
                            machinerunningHourM1 = machineGroup.Sum(i => i.machinerunningHourM1),
                            unit = machineGroup.First().unit
                        });
                    }
                }
            }
            model.ConsumptionTotals = consumptionTotals;
            GetCustKPIs.Wait();
            if (ActiveCustomer.overviewVersion == null)
            {
                return(PartialView("_Overview_1", model));
            }
            else
            {
                return(PartialView("_Overview_" + ActiveCustomer.overviewVersion, model));
            }
        }