public virtual IEnumerable <ValidationResult> Execute(int userId, int vehicleId, ICreateFillupEntryCommand fillup)
        {
            var foundVehicle = _vehicleRepository.GetVehicle(userId, vehicleId);

            if (foundVehicle == null)
            {
                yield return(new ValidationResult(Resources.VehicleNotFound));
            }
            else
            {
                var fillups = _fillupRepository.GetFillups(vehicleId);

                if (!fillups.Any())
                {
                    yield break;
                }

                var priorFillup = fillups.Where(f => f.Date < fillup.Date).FirstOrDefault();

                if ((priorFillup != null) && (priorFillup.Odometer >= fillup.Odometer))
                {
                    yield return(new ValidationResult(
                                     "Odometer",
                                     string.Format(CultureInfo.CurrentUICulture,
                                                   Resources.OdometerNotGreaterThanPrior,
                                                   priorFillup.Odometer)));
                }
            }
        }
        public virtual IEnumerable <ReminderModel> Execute(int userId)
        {
            // this results in a SELECT N+1 scenario
            try
            {
                var vehicles = _vehicleRepository.GetVehicles(userId);

                var reminders = (from vehicle in vehicles
                                 let fillups = _fillupRepository.GetFillups(vehicle.VehicleId)
                                               let stats = CalculateStatistics.Calculate(fillups)
                                                           let odometer = stats.Odometer
                                                                          from reminder in _reminderRepository.GetRemindersForVehicle(vehicle.VehicleId)
                                                                          select new { viewmodel = ToViewModel(reminder), odometer })
                                .ToList();

                foreach (var item in reminders)
                {
                    item.viewmodel.UpdateLastVehicleOdometer(item.odometer);
                }

                var overdueReminders = reminders
                                       .Select(x => x.viewmodel)
                                       .Where(f => !f.IsFulfilled && f.IsOverdue)
                                       .OrderBy(f => f.DueDistance)
                                       .ThenBy(f => f.DueDate)
                                       .ToList();

                return(overdueReminders.ToList());
            }
            catch (InvalidOperationException ex)
            {
                throw new UnauthorizedException(Resources.UnableToRetrieveOverdueReminders, ex);
            }
        }
Exemple #3
0
        public virtual VehicleModel Execute(int userId, int vehicleId)
        {
            Vehicle vehicle = _vehicleRepository.GetVehicle(userId, vehicleId);

            if (vehicle == null)
            {
                return(null);
            }

            var fillups    = _fillupRepository.GetFillups(vehicle.VehicleId).OrderBy(f => f.Odometer);
            var statistics = CalculateStatistics.Calculate(fillups);

            return(new VehicleModel(vehicle, statistics));
        }
Exemple #4
0
        public virtual IEnumerable <VehicleModel> Execute(int userId)
        {
            IEnumerable <Vehicle> vehicleData = null;

            vehicleData = _vehicleRepository.GetVehicles(userId);

            var vehicles = from vehicle in vehicleData
                           let fillups = _fillupRepository.GetFillups(vehicle.VehicleId).OrderBy(f => f.Odometer)
                                         let statistics = CalculateStatistics.Calculate(fillups, includeFirst: false)
                                                          orderby vehicle.SortOrder
                                                          select new VehicleModel(vehicle, statistics);

            return(vehicles);
        }
        public virtual FleetStatistics Execute(int userId)
        {
            var vehicles = _vehicleRepository.GetVehicles(userId);

            var stats = from vehicle in vehicles
                        let fillups = _fillupRepository.GetFillups(vehicle.VehicleId)
                                      where fillups.Any()
                                      let statistics = CalculateStatistics.Calculate(fillups, includeFirst: false)
                                                       select statistics;

            // These statistic calculations are for illustrative purposes only.
            // If you were to build this application for real, you probably want to calculate this
            // data more accurately and cache the results.

            return(new FleetStatistics(stats));
        }
        public virtual IEnumerable <FillupEntry> Execute(int vehicleId)
        {
            try
            {
                var fillups = _fillupRepository
                              .GetFillups(vehicleId)
                              .OrderBy(f => f.Date)
                              .ToList();

                return(new ReadOnlyCollection <FillupEntry>(fillups));
            }
            catch (InvalidOperationException ex)
            {
                throw new BusinessServicesException(Resources.UnableToRetireveFillupsExceptionMessage, ex);
            }
        }
        private void CalculateSeriesForVehicle(Vehicle vehicle, StatisticSeries series, DateTime?startDate, DateTime?endDate)
        {
            Debug.Assert(series != null);

            DateTime startFilterDate = startDate ?? DateTime.MinValue;
            DateTime endFilterDate   = endDate ?? DateTime.UtcNow;

            var fillUps = _fillupRepository.GetFillups(vehicle.VehicleId);

            var fillupGroups = from fillUp in fillUps
                               where ((fillUp.Date >= startFilterDate) && (fillUp.Date <= endFilterDate))
                               group fillUp by new { Year = fillUp.Date.Year, Month = fillUp.Date.Month }
            into g
            orderby g.Key.Year, g.Key.Month
            select g;

            var firstFillUp = fillUps.OrderBy(x => x.Date).FirstOrDefault();

            VehicleStatisticsModel statistics;

            foreach (var fillupGroup in fillupGroups)
            {
                var includeFirstFillup = (fillupGroup.Key.Year != firstFillUp.Date.Year) ||
                                         (fillupGroup.Key.Month != firstFillUp.Date.Month);

                statistics = CalculateStatistics.Calculate(fillupGroup, includeFirstFillup);

                Debug.Assert(firstFillUp != null);


                var seriesEntry = new StatisticSeriesEntry
                {
                    Id    = vehicle.VehicleId,
                    Name  = vehicle.Name,
                    Year  = fillupGroup.Key.Year,
                    Month = fillupGroup.Key.Month,
                    AverageFuelEfficiency = Math.Round(statistics.AverageFuelEfficiency, 2),
                    TotalCost             = Math.Round(statistics.TotalCost, 2),
                    TotalDistance         = statistics.TotalDistance,
                };
                series.Entries.Add(seriesEntry);
            }
        }
        public virtual IEnumerable <ValidationResult> Execute(int userId, ICreateReminderCommand reminder)
        {
            var foundVehicle = _vehicleRepository.GetVehicle(userId, reminder.VehicleId);

            if (foundVehicle == null)
            {
                yield return(new ValidationResult(Resources.VehicleNotFound));
            }
            else
            {
                var fillups  = _fillupRepository.GetFillups(reminder.VehicleId);
                var stats    = CalculateStatistics.Calculate(fillups);
                var odometer = stats.Odometer;

                if ((reminder.DueDistance.HasValue) && (reminder.DueDistance.Value <= odometer))
                {
                    yield return(new ValidationResult(
                                     "DueDistance",
                                     string.Format(CultureInfo.CurrentUICulture, Resources.DueDistanceNotGreaterThanOdometer, odometer)));
                }
            }
        }
        private void AdjustSurroundingFillupEntries(FillupEntry newFillup)
        {
            if (newFillup == null)
            {
                throw new ArgumentNullException("newFillup");
            }

            var fillups = _fillupRepository.GetFillups(newFillup.VehicleId);

            // Prior fillups are ordered descending so that FirstOrDefault() chooses the one closest to the new fillup.
            // Secondary ordering is by entry ID ensure a consistent ordering/
            var priorFillup = fillups
                              .OrderByDescending(f => f.Date).ThenByDescending(f => f.FillupEntryId)
                              .FirstOrDefault(f => (f.Date <= newFillup.Date) && (f.FillupEntryId != newFillup.FillupEntryId));

            // Prior fillups are ordered ascending that FirstOrDefault() chooses the one closest to the new fillup.
            // Secondary ordering is by entry ID ensure a consistent ordering.
            var nextFillup = fillups
                             .OrderBy(f => f.Date).ThenBy(f => f.FillupEntryId)
                             .FirstOrDefault(f => (f.Date >= newFillup.Date) && (f.FillupEntryId != newFillup.FillupEntryId));

            CalculateInterFillupStatistics(newFillup, priorFillup);
            CalculateInterFillupStatistics(nextFillup, newFillup);
        }