public List <AnnualMileageReportDTO> GetAnnualMileageReportData(AnnualMileageReportSearchCriteria criteria)
 {
     return(new AnnualMileageReportBLL().GetAnnualMileageReport(criteria));
     //return new List<AnnualMileageReportDTO>();
 }
        public List <AnnualMileageReportDTO> GetAnnualMileageReport(AnnualMileageReportSearchCriteria criteria)
        {
            var vehicles = (from v in context.CfVehicles
                            join f in context.CfProfileFleet on v.IdprofileFleet equals f.IdprofileFleet
                            join t in context.CfProfileTerminal on f.IdprofileTerminal equals t.IdprofileTerminal
                            join a in context.CfProfileAccount on t.IdprofileAccount equals a.IdprofileAccount
                            where a.IdprofileAccount == criteria.AccountId
                            select new
            {
                Vehicle = v,
                Fleet = f,
                Terminal = t,
                Account = a
            });

            if (criteria.FleetId != 0)
            {
                vehicles = vehicles.Where(v => criteria.FleetId == v.Fleet.IdprofileFleet);
            }
            if (criteria.TerminalId != 0)
            {
                vehicles = vehicles.Where(v => criteria.TerminalId == v.Terminal.IdprofileTerminal);
            }
            vehicles.ToList();

            var list = new List <AnnualMileageReportDTO>();

            foreach (var v in vehicles)
            {
                var dto = new AnnualMileageReportDTO {
                    Location   = string.Format("{0}/{1}", v.Terminal.TerminalName, v.Fleet.FleetName),
                    UnitNumber = v.Vehicle.UnitNo.ToString(),
                    VIN        = v.Vehicle.ChassisVin
                };

                var m2 = (from m in context.CfVehiclesLogMileage
                          where v.Vehicle.Idvehicles == m.Idvehicles && (DateTime.Now.Year - 2) == ((DateTime)m.MileageDate).Year
                          select m).OrderByDescending(d => d.EnterDate).FirstOrDefault();
                if (null != m2)
                {
                    dto.MileageDateTwoYearsAgo = ((DateTime)m2.MileageDate).ToShortDateString();
                    dto.MileageTwoYearsAgo     = m2.Mileage.ToString();
                }
                else
                {
                    dto.MileageDateTwoYearsAgo =
                        dto.MileageTwoYearsAgo = string.Empty;
                }

                var m1 = (from m in context.CfVehiclesLogMileage
                          where v.Vehicle.Idvehicles == m.Idvehicles && (DateTime.Now.Year - 1) == ((DateTime)m.MileageDate).Year
                          select m).OrderByDescending(d => d.EnterDate).FirstOrDefault();
                if (null != m1)
                {
                    dto.MileageDateLastYear = ((DateTime)m1.MileageDate).ToShortDateString();
                    dto.MileageLastYear     = m1.Mileage.ToString();
                }
                else
                {
                    dto.MileageDateLastYear =
                        dto.MileageLastYear = string.Empty;
                }


                var mc = (from m in context.CfVehiclesLogMileage
                          where v.Vehicle.Idvehicles == m.Idvehicles && (DateTime.Now.Year) == ((DateTime)m.MileageDate).Year
                          select m).OrderByDescending(d => d.EnterDate).FirstOrDefault();

                if (null != mc)
                {
                    dto.MileageDateCurrentYear = ((DateTime)mc.MileageDate).ToShortDateString();
                    dto.MileageCurrentYear     = mc.Mileage.ToString();
                }
                else
                {
                    dto.MileageDateCurrentYear =
                        dto.MileageCurrentYear = string.Empty;
                }

                var mileage2 = 0;
                var mileage1 = 0;
                var mileagec = 0;
                //dtm = "do the math"
                bool dtm2 = Int32.TryParse(dto.MileageTwoYearsAgo, out mileage2);
                bool dtm1 = Int32.TryParse(dto.MileageLastYear, out mileage1);
                bool dtmc = Int32.TryParse(dto.MileageCurrentYear, out mileagec);

                if (dtm2 && dtm1)
                {
                    dto.MilesTwoYearsAgo = (mileage1 - mileage2).ToString();
                }
                else
                {
                    dto.MilesTwoYearsAgo =
                        dto.MilesAverage = "Missing Entry";
                }

                if (dtm1 && dtmc)
                {
                    dto.MilesLastYear = (mileagec - mileage1).ToString();
                }
                else
                {
                    dto.MilesLastYear    =
                        dto.MilesAverage = "Missing Entry";
                }


                if (dtm1 && dtm2 && dtmc)
                {
                    dto.MilesAverage = ((Convert.ToInt32(dto.MilesLastYear) + Convert.ToInt32(dto.MilesTwoYearsAgo)) / 2).ToString();
                }

                list.Add(dto);
            }
            list = list.OrderBy(ob => ob.Location).ThenBy(tb => tb.UnitNumber).ToList();

            return(list);
        }