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)); } }