diff --git a/Controllers/APIController.cs b/Controllers/APIController.cs index 5fe4a0e..1cd2f4e 100644 --- a/Controllers/APIController.cs +++ b/Controllers/APIController.cs @@ -26,6 +26,7 @@ namespace CarCareTracker.Controllers private readonly IReminderHelper _reminderHelper; private readonly IGasHelper _gasHelper; private readonly IUserLogic _userLogic; + private readonly IVehicleLogic _vehicleLogic; private readonly IOdometerLogic _odometerLogic; private readonly IFileHelper _fileHelper; private readonly IMailHelper _mailHelper; @@ -47,6 +48,7 @@ namespace CarCareTracker.Controllers IFileHelper fileHelper, IConfigHelper config, IUserLogic userLogic, + IVehicleLogic vehicleLogic, IOdometerLogic odometerLogic) { _dataAccess = dataAccess; @@ -65,6 +67,7 @@ namespace CarCareTracker.Controllers _reminderHelper = reminderHelper; _userLogic = userLogic; _odometerLogic = odometerLogic; + _vehicleLogic = vehicleLogic; _fileHelper = fileHelper; _config = config; } @@ -350,7 +353,7 @@ namespace CarCareTracker.Controllers [Route("/api/vehicle/odometerrecords/latest")] public IActionResult LastOdometer(int vehicleId) { - var result = GetMaxMileage(vehicleId); + var result = _vehicleLogic.GetMaxMileage(vehicleId); return Json(result); } [TypeFilter(typeof(CollaboratorFilter))] @@ -499,7 +502,7 @@ namespace CarCareTracker.Controllers [Route("/api/vehicle/reminders")] public IActionResult Reminders(int vehicleId) { - var currentMileage = GetMaxMileage(vehicleId); + var currentMileage = _vehicleLogic.GetMaxMileage(vehicleId); var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId); var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now).Select(x=> new ReminderExportModel { Description = x.Description, Urgency = x.Urgency.ToString(), Metric = x.Metric.ToString(), Notes = x.Notes}); return Json(results); @@ -515,7 +518,7 @@ namespace CarCareTracker.Controllers { var vehicleId = vehicle.Id; //get reminders - var currentMileage = GetMaxMileage(vehicleId); + var currentMileage = _vehicleLogic.GetMaxMileage(vehicleId); var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId); var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now).OrderByDescending(x => x.Urgency).ToList(); results.RemoveAll(x => !urgencies.Contains(x.Urgency)); @@ -565,35 +568,5 @@ namespace CarCareTracker.Controllers var result = _fileHelper.RestoreBackup("/defaults/demo_default.zip", true); return Json(result); } - private int GetMaxMileage(int vehicleId) - { - var numbersArray = new List(); - var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId); - if (serviceRecords.Any()) - { - numbersArray.Add(serviceRecords.Max(x => x.Mileage)); - } - var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId); - if (repairRecords.Any()) - { - numbersArray.Add(repairRecords.Max(x => x.Mileage)); - } - var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId); - if (gasRecords.Any()) - { - numbersArray.Add(gasRecords.Max(x => x.Mileage)); - } - var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId); - if (upgradeRecords.Any()) - { - numbersArray.Add(upgradeRecords.Max(x => x.Mileage)); - } - var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId); - if (odometerRecords.Any()) - { - numbersArray.Add(odometerRecords.Max(x => x.Mileage)); - } - return numbersArray.Any() ? numbersArray.Max() : 0; - } } } diff --git a/Controllers/HomeController.cs b/Controllers/HomeController.cs index 2cd9547..be13b9e 100644 --- a/Controllers/HomeController.cs +++ b/Controllers/HomeController.cs @@ -16,6 +16,7 @@ namespace CarCareTracker.Controllers private readonly IVehicleDataAccess _dataAccess; private readonly IUserLogic _userLogic; private readonly ILoginLogic _loginLogic; + private readonly IVehicleLogic _vehicleLogic; private readonly IFileHelper _fileHelper; private readonly IConfigHelper _config; private readonly IExtraFieldDataAccess _extraFieldDataAccess; @@ -25,6 +26,7 @@ namespace CarCareTracker.Controllers IVehicleDataAccess dataAccess, IUserLogic userLogic, ILoginLogic loginLogic, + IVehicleLogic vehicleLogic, IConfigHelper configuration, IFileHelper fileHelper, IExtraFieldDataAccess extraFieldDataAccess, @@ -40,6 +42,7 @@ namespace CarCareTracker.Controllers _reminderRecordDataAccess = reminderRecordDataAccess; _reminderHelper = reminderHelper; _loginLogic = loginLogic; + _vehicleLogic = vehicleLogic; } private int GetUserID() { @@ -56,7 +59,23 @@ namespace CarCareTracker.Controllers { vehiclesStored = _userLogic.FilterUserVehicles(vehiclesStored, GetUserID()); } - return PartialView("_GarageDisplay", vehiclesStored); + var vehicleViewModels = vehiclesStored.Select(x => new VehicleViewModel + { + Id = x.Id, + ImageLocation = x.ImageLocation, + Year = x.Year, + Make = x.Make, + Model = x.Model, + LicensePlate = x.LicensePlate, + SoldDate = x.SoldDate, + IsElectric = x.IsElectric, + UseHours = x.UseHours, + ExtraFields = x.ExtraFields, + Tags = x.Tags, + LastReportedMileage = _vehicleLogic.GetMaxMileage(x.Id), + HasReminders = _vehicleLogic.GetVehicleHasUrgentOrPastDueReminders(x.Id) + }).ToList(); + return PartialView("_GarageDisplay", vehicleViewModels); } public IActionResult Calendar() { diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index d98bf7a..df973c4 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -36,6 +36,7 @@ namespace CarCareTracker.Controllers private readonly IReportHelper _reportHelper; private readonly IUserLogic _userLogic; private readonly IOdometerLogic _odometerLogic; + private readonly IVehicleLogic _vehicleLogic; private readonly IExtraFieldDataAccess _extraFieldDataAccess; public VehicleController(ILogger logger, @@ -58,6 +59,7 @@ namespace CarCareTracker.Controllers IExtraFieldDataAccess extraFieldDataAccess, IUserLogic userLogic, IOdometerLogic odometerLogic, + IVehicleLogic vehicleLogic, IWebHostEnvironment webEnv, IConfigHelper config) { @@ -81,6 +83,7 @@ namespace CarCareTracker.Controllers _extraFieldDataAccess = extraFieldDataAccess; _userLogic = userLogic; _odometerLogic = odometerLogic; + _vehicleLogic = vehicleLogic; _webEnv = webEnv; _config = config; } @@ -1329,9 +1332,9 @@ namespace CarCareTracker.Controllers { var vehicleHistory = new VehicleHistoryViewModel(); vehicleHistory.VehicleData = _dataAccess.GetVehicleById(vehicleId); - var maxMileage = GetMaxMileage(vehicleId); + var maxMileage = _vehicleLogic.GetMaxMileage(vehicleId); vehicleHistory.Odometer = maxMileage.ToString("N0"); - var minMileage = GetMinMileage(vehicleId); + var minMileage = _vehicleLogic.GetMinMileage(vehicleId); var distanceTraveled = maxMileage - minMileage; if (!string.IsNullOrWhiteSpace(vehicleHistory.VehicleData.PurchaseDate)) { @@ -1516,71 +1519,9 @@ namespace CarCareTracker.Controllers } #endregion #region "Reminders" - [TypeFilter(typeof(CollaboratorFilter))] - private int GetMaxMileage(int vehicleId) - { - var numbersArray = new List(); - var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId); - if (serviceRecords.Any()) - { - numbersArray.Add(serviceRecords.Max(x => x.Mileage)); - } - var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId); - if (repairRecords.Any()) - { - numbersArray.Add(repairRecords.Max(x => x.Mileage)); - } - var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId); - if (gasRecords.Any()) - { - numbersArray.Add(gasRecords.Max(x => x.Mileage)); - } - var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId); - if (upgradeRecords.Any()) - { - numbersArray.Add(upgradeRecords.Max(x => x.Mileage)); - } - var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId); - if (odometerRecords.Any()) - { - numbersArray.Add(odometerRecords.Max(x => x.Mileage)); - } - return numbersArray.Any() ? numbersArray.Max() : 0; - } - [TypeFilter(typeof(CollaboratorFilter))] - private int GetMinMileage(int vehicleId) - { - var numbersArray = new List(); - var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default); - if (serviceRecords.Any()) - { - numbersArray.Add(serviceRecords.Min(x => x.Mileage)); - } - var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default); - if (repairRecords.Any()) - { - numbersArray.Add(repairRecords.Min(x => x.Mileage)); - } - var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default); - if (gasRecords.Any()) - { - numbersArray.Add(gasRecords.Min(x => x.Mileage)); - } - var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default); - if (upgradeRecords.Any()) - { - numbersArray.Add(upgradeRecords.Min(x => x.Mileage)); - } - var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default); - if (odometerRecords.Any()) - { - numbersArray.Add(odometerRecords.Min(x => x.Mileage)); - } - return numbersArray.Any() ? numbersArray.Min() : 0; - } private List GetRemindersAndUrgency(int vehicleId, DateTime dateCompare) { - var currentMileage = GetMaxMileage(vehicleId); + var currentMileage = _vehicleLogic.GetMaxMileage(vehicleId); var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId); List results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, dateCompare); return results; diff --git a/Logic/VehicleLogic.cs b/Logic/VehicleLogic.cs new file mode 100644 index 0000000..38f0696 --- /dev/null +++ b/Logic/VehicleLogic.cs @@ -0,0 +1,107 @@ +using CarCareTracker.External.Interfaces; +using CarCareTracker.Helper; +using CarCareTracker.Models; + +namespace CarCareTracker.Logic +{ + public interface IVehicleLogic + { + int GetMaxMileage(int vehicleId); + int GetMinMileage(int vehicleId); + bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId); + } + public class VehicleLogic: IVehicleLogic + { + private readonly IServiceRecordDataAccess _serviceRecordDataAccess; + private readonly IGasRecordDataAccess _gasRecordDataAccess; + private readonly ICollisionRecordDataAccess _collisionRecordDataAccess; + private readonly IUpgradeRecordDataAccess _upgradeRecordDataAccess; + private readonly IOdometerRecordDataAccess _odometerRecordDataAccess; + private readonly IReminderRecordDataAccess _reminderRecordDataAccess; + private readonly IReminderHelper _reminderHelper; + public VehicleLogic( + IServiceRecordDataAccess serviceRecordDataAccess, + IGasRecordDataAccess gasRecordDataAccess, + ICollisionRecordDataAccess collisionRecordDataAccess, + IUpgradeRecordDataAccess upgradeRecordDataAccess, + IOdometerRecordDataAccess odometerRecordDataAccess, + IReminderRecordDataAccess reminderRecordDataAccess, + IReminderHelper reminderHelper + ) { + _serviceRecordDataAccess = serviceRecordDataAccess; + _gasRecordDataAccess = gasRecordDataAccess; + _collisionRecordDataAccess = collisionRecordDataAccess; + _upgradeRecordDataAccess = upgradeRecordDataAccess; + _odometerRecordDataAccess = odometerRecordDataAccess; + _reminderRecordDataAccess = reminderRecordDataAccess; + _reminderHelper = reminderHelper; + } + public int GetMaxMileage(int vehicleId) + { + var numbersArray = new List(); + var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId); + if (serviceRecords.Any()) + { + numbersArray.Add(serviceRecords.Max(x => x.Mileage)); + } + var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId); + if (repairRecords.Any()) + { + numbersArray.Add(repairRecords.Max(x => x.Mileage)); + } + var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId); + if (gasRecords.Any()) + { + numbersArray.Add(gasRecords.Max(x => x.Mileage)); + } + var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId); + if (upgradeRecords.Any()) + { + numbersArray.Add(upgradeRecords.Max(x => x.Mileage)); + } + var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId); + if (odometerRecords.Any()) + { + numbersArray.Add(odometerRecords.Max(x => x.Mileage)); + } + return numbersArray.Any() ? numbersArray.Max() : 0; + } + public int GetMinMileage(int vehicleId) + { + var numbersArray = new List(); + var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default); + if (serviceRecords.Any()) + { + numbersArray.Add(serviceRecords.Min(x => x.Mileage)); + } + var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default); + if (repairRecords.Any()) + { + numbersArray.Add(repairRecords.Min(x => x.Mileage)); + } + var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default); + if (gasRecords.Any()) + { + numbersArray.Add(gasRecords.Min(x => x.Mileage)); + } + var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default); + if (upgradeRecords.Any()) + { + numbersArray.Add(upgradeRecords.Min(x => x.Mileage)); + } + var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default); + if (odometerRecords.Any()) + { + numbersArray.Add(odometerRecords.Min(x => x.Mileage)); + } + return numbersArray.Any() ? numbersArray.Min() : 0; + } + public bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId) + { + var currentMileage = GetMaxMileage(vehicleId); + var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId); + var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now); + return results.Any(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue); + } + } +} diff --git a/Models/VehicleViewModel.cs b/Models/VehicleViewModel.cs new file mode 100644 index 0000000..bf6c2bd --- /dev/null +++ b/Models/VehicleViewModel.cs @@ -0,0 +1,19 @@ +namespace CarCareTracker.Models +{ + public class VehicleViewModel + { + public int Id { get; set; } + public string ImageLocation { get; set; } = "/defaults/noimage.png"; + public int Year { get; set; } + public string Make { get; set; } + public string Model { get; set; } + public string LicensePlate { get; set; } + public string SoldDate { get; set; } + public bool IsElectric { get; set; } = false; + public bool UseHours { get; set; } = false; + public List ExtraFields { get; set; } = new List(); + public List Tags { get; set; } = new List(); + public int LastReportedMileage; + public bool HasReminders = false; + } +} diff --git a/Program.cs b/Program.cs index afbb9bb..69aef1a 100644 --- a/Program.cs +++ b/Program.cs @@ -73,6 +73,7 @@ builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +builder.Services.AddSingleton(); if (!Directory.Exists("data")) { diff --git a/Views/Home/_GarageDisplay.cshtml b/Views/Home/_GarageDisplay.cshtml index bfab768..7beb380 100644 --- a/Views/Home/_GarageDisplay.cshtml +++ b/Views/Home/_GarageDisplay.cshtml @@ -1,7 +1,7 @@ @using CarCareTracker.Helper @inject IConfigHelper config @inject ITranslationHelper translator -@model List +@model List @{ var userConfig = config.GetUserConfig(User); var userLanguage = userConfig.UserLanguage; @@ -26,7 +26,7 @@ }
- @foreach (Vehicle vehicle in Model) + @foreach (VehicleViewModel vehicle in Model) { @if (!(userConfig.HideSoldVehicles && !string.IsNullOrWhiteSpace(vehicle.SoldDate))) { @@ -36,6 +36,22 @@ @if (!string.IsNullOrWhiteSpace(vehicle.SoldDate)) {

@translator.Translate(userLanguage, "SOLD")

+ } else if (vehicle.LastReportedMileage != default) + { +
+
+
+ @vehicle.LastReportedMileage.ToString("N0") +
+ @if (vehicle.HasReminders) + { +
+ +
+ } +
+ +
}
@($"{vehicle.Year}")