diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index a9473ad..74ad888 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -1140,6 +1140,11 @@ namespace CarCareTracker.Controllers var taxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId); var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId); var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId); + var maxMileage = _vehicleLogic.GetMaxMileage(serviceRecords, collisionRecords, gasRecords, upgradeRecords, odometerRecords); + var minMileage = _vehicleLogic.GetMinMileage(serviceRecords, collisionRecords, gasRecords, upgradeRecords, odometerRecords); + var vehicleData = _dataAccess.GetVehicleById(vehicleId); + var userConfig = _config.GetUserConfig(User); + var totalDistanceTraveled = maxMileage - minMileage; var viewModel = new ReportViewModel(); //get totalCostMakeUp viewModel.CostMakeUpForVehicle = new CostMakeUpForVehicle @@ -1148,7 +1153,9 @@ namespace CarCareTracker.Controllers GasRecordSum = gasRecords.Sum(x => x.Cost), CollisionRecordSum = collisionRecords.Sum(x => x.Cost), TaxRecordSum = taxRecords.Sum(x => x.Cost), - UpgradeRecordSum = upgradeRecords.Sum(x => x.Cost) + UpgradeRecordSum = upgradeRecords.Sum(x => x.Cost), + TotalDistance = totalDistanceTraveled, + DistanceUnit = vehicleData.UseHours ? "Per Hour" : userConfig.UseMPG ? "Per Mile" : "Per Kilometer" }; //get costbymonth List allCosts = StaticHelper.GetBaseLineCosts(); @@ -1205,7 +1212,6 @@ namespace CarCareTracker.Controllers var collaborators = _userLogic.GetCollaboratorsForVehicle(vehicleId); viewModel.Collaborators = collaborators; //get MPG per month. - var userConfig = _config.GetUserConfig(User); var mileageData = _gasHelper.GetGasRecordViewModels(gasRecords, userConfig.UseMPG, userConfig.UseUKMPG); mileageData.RemoveAll(x => x.MilesPerGallon == default); var monthlyMileageData = StaticHelper.GetBaseLineCostsNoMonthName(); @@ -1253,6 +1259,7 @@ namespace CarCareTracker.Controllers var collisionRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId); var taxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId); var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId); + var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId); if (year != default) { serviceRecords.RemoveAll(x => x.Date.Year != year); @@ -1260,14 +1267,22 @@ namespace CarCareTracker.Controllers collisionRecords.RemoveAll(x => x.Date.Year != year); taxRecords.RemoveAll(x => x.Date.Year != year); upgradeRecords.RemoveAll(x => x.Date.Year != year); + odometerRecords.RemoveAll(x => x.Date.Year != year); } + var maxMileage = _vehicleLogic.GetMaxMileage(serviceRecords, collisionRecords, gasRecords, upgradeRecords, odometerRecords); + var minMileage = _vehicleLogic.GetMinMileage(serviceRecords, collisionRecords, gasRecords, upgradeRecords, odometerRecords); + var totalDistanceTraveled = maxMileage - minMileage; + var vehicleData = _dataAccess.GetVehicleById(vehicleId); + var userConfig = _config.GetUserConfig(User); var viewModel = new CostMakeUpForVehicle { ServiceRecordSum = serviceRecords.Sum(x => x.Cost), GasRecordSum = gasRecords.Sum(x => x.Cost), CollisionRecordSum = collisionRecords.Sum(x => x.Cost), TaxRecordSum = taxRecords.Sum(x => x.Cost), - UpgradeRecordSum = upgradeRecords.Sum(x => x.Cost) + UpgradeRecordSum = upgradeRecords.Sum(x => x.Cost), + TotalDistance = totalDistanceTraveled, + DistanceUnit = vehicleData.UseHours ? "Per Hour" : userConfig.UseMPG ? "Per Mile" : "Per Kilometer" }; return PartialView("_CostMakeUpReport", viewModel); } diff --git a/Logic/VehicleLogic.cs b/Logic/VehicleLogic.cs index 38f0696..c5d87d3 100644 --- a/Logic/VehicleLogic.cs +++ b/Logic/VehicleLogic.cs @@ -7,7 +7,9 @@ namespace CarCareTracker.Logic public interface IVehicleLogic { int GetMaxMileage(int vehicleId); + int GetMaxMileage(List serviceRecords, List repairRecords, List gasRecords, List upgradeRecords, List odometerRecords); int GetMinMileage(int vehicleId); + int GetMinMileage(List serviceRecords, List repairRecords, List gasRecords, List upgradeRecords, List odometerRecords); bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId); } public class VehicleLogic: IVehicleLogic @@ -66,6 +68,31 @@ namespace CarCareTracker.Logic } return numbersArray.Any() ? numbersArray.Max() : 0; } + public int GetMaxMileage(List serviceRecords, List repairRecords, List gasRecords, List upgradeRecords, List odometerRecords) + { + var numbersArray = new List(); + if (serviceRecords.Any()) + { + numbersArray.Add(serviceRecords.Max(x => x.Mileage)); + } + if (repairRecords.Any()) + { + numbersArray.Add(repairRecords.Max(x => x.Mileage)); + } + if (gasRecords.Any()) + { + numbersArray.Add(gasRecords.Max(x => x.Mileage)); + } + if (upgradeRecords.Any()) + { + numbersArray.Add(upgradeRecords.Max(x => x.Mileage)); + } + 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(); @@ -96,6 +123,36 @@ namespace CarCareTracker.Logic } return numbersArray.Any() ? numbersArray.Min() : 0; } + public int GetMinMileage(List serviceRecords, List repairRecords, List gasRecords, List upgradeRecords, List odometerRecords) + { + var numbersArray = new List(); + var _serviceRecords = serviceRecords.Where(x => x.Mileage != default).ToList(); + if (_serviceRecords.Any()) + { + numbersArray.Add(_serviceRecords.Min(x => x.Mileage)); + } + var _repairRecords = repairRecords.Where(x => x.Mileage != default).ToList(); + if (_repairRecords.Any()) + { + numbersArray.Add(_repairRecords.Min(x => x.Mileage)); + } + var _gasRecords = gasRecords.Where(x => x.Mileage != default).ToList(); + if (_gasRecords.Any()) + { + numbersArray.Add(_gasRecords.Min(x => x.Mileage)); + } + var _upgradeRecords = upgradeRecords.Where(x => x.Mileage != default).ToList(); + if (_upgradeRecords.Any()) + { + numbersArray.Add(_upgradeRecords.Min(x => x.Mileage)); + } + var _odometerRecords = odometerRecords.Where(x => x.Mileage != default).ToList(); + 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); diff --git a/Models/Report/CostMakeUpForVehicle.cs b/Models/Report/CostMakeUpForVehicle.cs index a7846f0..0497db4 100644 --- a/Models/Report/CostMakeUpForVehicle.cs +++ b/Models/Report/CostMakeUpForVehicle.cs @@ -2,10 +2,24 @@ { public class CostMakeUpForVehicle { + public string DistanceUnit { get; set; } = "Per Mile"; + public int TotalDistance { get; set; } public decimal ServiceRecordSum { get; set; } public decimal GasRecordSum { get; set; } public decimal TaxRecordSum { get; set; } public decimal CollisionRecordSum { get; set; } public decimal UpgradeRecordSum { get; set; } + public decimal ServiceRecordPerMile { get { return TotalDistance != default ? ServiceRecordSum / TotalDistance : 0; } } + public decimal GasRecordPerMile { get { return TotalDistance != default ? GasRecordSum / TotalDistance : 0; } } + public decimal CollisionRecordPerMile { get { return TotalDistance != default ? CollisionRecordSum / TotalDistance : 0; } } + public decimal UpgradeRecordPerMile { get { return TotalDistance != default ? UpgradeRecordSum / TotalDistance : 0; } } + public decimal ServiceRecordPerMonth { get { return ServiceRecordSum / 12; } } + public decimal GasRecordPerMonth { get { return GasRecordSum / 12; } } + public decimal CollisionRecordPerMonth { get { return CollisionRecordSum / 12; } } + public decimal UpgradeRecordPerMonth { get { return UpgradeRecordSum / 12; } } + public decimal TaxRecordPerMonth { get { return TaxRecordSum / 12; } } + public decimal TotalPerMonth { get { return ServiceRecordPerMonth + CollisionRecordPerMonth + UpgradeRecordPerMonth + GasRecordPerMonth + TaxRecordPerMonth; } } + public decimal TotalPerMile { get { return ServiceRecordPerMile + CollisionRecordPerMile + UpgradeRecordPerMile + GasRecordPerMile; } } + public decimal TotalCost { get { return ServiceRecordSum + CollisionRecordSum + UpgradeRecordSum + GasRecordSum + TaxRecordSum; } } } } diff --git a/Views/Vehicle/_CostMakeUpReport.cshtml b/Views/Vehicle/_CostMakeUpReport.cshtml index 160bd1d..00b16d4 100644 --- a/Views/Vehicle/_CostMakeUpReport.cshtml +++ b/Views/Vehicle/_CostMakeUpReport.cshtml @@ -8,6 +8,66 @@ @model CostMakeUpForVehicle @if (Model.CollisionRecordSum + Model.ServiceRecordSum + Model.GasRecordSum + Model.TaxRecordSum + Model.UpgradeRecordSum > 0) { +
+ + +